Java设计模式

五分钟快速入门装饰、适配器、模板方法三种设计模式

2017-12-13  本文已影响14人  视野跳动

前言:设计模式的概念是很抽象的,不好理解,我第一次看完这些概念也是一面懵逼,又想了想,还是一面懵逼的。在这里将概念放在前面看不懂没关系,本章的正确学习方式应该是先看《案例演示》和《代码实现》然后再回头看概念(别看概念很难理解,其实都是纸老虎,将demo敲一遍,不懂,拿刀来砍我)

前言 :虽然有六大设计原则,二十三种设计模式,不过常见的设计模式也就那么几种,想要真正的掌握,肯定还需要我们结合具体的应用场景去练习去理解,方可应用!

一、装饰设计模式

/**
* Project:HelloWorld
* Package:cn.edu.java
* Author:SKFsky
* CreateTime:2017/12/13 14:11
* Description: 装饰设计模式
*/
public class Demo_Decorator {
   public static void main(String[] args) {
       //大学毕业时的路人甲
       System.out.println("大学毕业时的路人甲:");
       LuRenJia luRenJia = new LuRenJia();
       luRenJia.code();
       System.out.println();
       //经过特训后的路人甲
       System.out.println("经过特训后的路人甲:");
       Trainning train = new Trainning(new LuRenJia());
       train.code();
   }
}

interface Coder {
   public void code();
}

class LuRenJia implements Coder{
   @Override
   public void code() {
       System.out.println("我会Java");
       System.out.println("我会JavaWeb");
   }
}

class Trainning implements Coder {

   private LuRenJia lurenjia;   //获取到被包装的类的引用
   public Trainning(LuRenJia lurenjia){   //通过构造函数创建对象的时候,传入被包装的对象
       this.lurenjia = lurenjia;
   }

   @Override
   public void code() {      //对其原有功能进行升级
       lurenjia.code();
       System.out.println("我学会了数据库");
       System.out.println("我学会了Kotlin");
       System.out.println("我学会了设计模式");
       System.out.println("我学会了一阳指");
       System.out.println("我学会了一目千行");
       System.out.println("我学会了做笔记");
       System.out.println("我学会了.....");
   }
}

二、适配器设计模式


/**
 * Project:HelloWorld
 * Package:cn.edu.java
 * Author:SKFsky
 * CreateTime:2017/12/13 15:10
 * Description: 适配器设计模式
 */
public class Demo_Adapter {
    public static void main(String[] args) {
        tangtang tang = new tangtang();
        tang.dazuo();
        tang.nijing();
        luzhishen lu = new luzhishen();
        lu.xiwu();
        lu.chirou();
        lu.dajia();
    }
}

//和尚接口
interface HeShang{
    public void nijing();//念经
    public void dazuo();//打坐
    public void paobu();//跑步
    public void xiwu();//习武
}

//适配器,实现了接口,并且定义成抽象类型的类了(抽象的类不能被实例化),这里面的方法都是空的,不需要去实现
abstract class Adapter implements HeShang{

    @Override
    public void nijing() {

    }

    @Override
    public void dazuo() {

    }

    @Override
    public void paobu() {

    }

    @Override
    public void xiwu() {

    }
}

//唐僧
class tangtang extends Adapter {

    @Override
    public void nijing() {
        System.out.println("我是唐僧我喜欢念经");
    }

    @Override
    public void dazuo() {
        System.out.println("我是唐僧我喜欢打坐");
    }
}

//鲁智深,我们的知道他是一个花和尚,喜欢习武,吃酒吃肉
class luzhishen extends Adapter {

    @Override
    public void xiwu() {
        System.out.println("我是鲁智深我喜欢习武");
    }

    public void chirou() {
        System.out.println("我是鲁智深我喜欢吃肉");
    }

    public void dajia() {
        System.out.println("我是鲁智深我喜欢打架");
    }
}

三、模板方法设计模式

/**
 * Project:HelloWorld
 * Package:cn.edu.java
 * Author:SKFsky
 * CreateTime:2017/12/13 15:42
 * Description: 模板方法设计模式
 */
public class Demo_Template {
    public static void main(String[] args) {
        Demo demo = new Demo();
        long time = demo.getTime();
        System.out.println(time);
    }
}

//定义成抽象类,因为定义了一个抽象方法code()
abstract class GetTime {
    //用final关键字修饰,因为该方法是一个模板,不希望让子类重写。但是可以被子类调用。计算code方法的执行时长
    public final long getTime() {
        long start = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();
        return end - start;
    }

    //定义成抽象的,在子类中去实现
    public abstract void code();
}

class Demo extends GetTime{
    
    @Override
    public void code() {
        int i = 0;
        while (i<100000) {
            System.out.println("x");
            i++;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读