架构算法设计模式和编程理论Java设计模式Java学习笔记

设计模式思考

2017-12-13  本文已影响56人  freelands
designpattern.png

记得大三的时候第一次接触设计模式,觉得很cool,当时把head first 设计模式看了一遍,才知道原来代码还能这样设计。但是当时对于整个软件系统的架构和认识还不足,经过快两年的打磨,自己对于整体架构又有了新的收获。这两天再把大学时看过的head first 设计模式拿出来看看,发现一切都是那么优美。

image.png image.png image.png
//鸭子类都有个display方法
public abstract class Duck {
    public abstract void display();
}

//飞行接口
public interface Flyable {
    void fly();
}

//飞的慢
public class SlowFly implements Flyable{
    @Override
    public void fly() {
        System.out.println("slow fly");
    }
}

//飞的快
public class QuickFly implements Flyable {
    @Override
    public void fly() {
        System.out.println("quick fly");
    }
}

//叫接口
public interface Quackable {
    void quack();
}

//温柔的叫
public class GentleQuack implements Quackable {

    @Override
    public void quack() {
        System.out.println("warm quack");
    }

}

//尖锐的叫
public class HarshQuack implements Quackable {
    @Override
    public void quack() {
        System.out.println("harsh quack");
    }
}

//一般的鸭子都会叫
public class GeneralDuck extends Duck {

    public GeneralDuck(Quackable quackable) {
        this.quackable = quackable;
    }

    private Quackable quackable;

    public void setQuackable(Quackable quackable) {
        this.quackable = quackable;
    }

    @Override
    public void display() {
        System.out.println("gentle display");
    }

    public void quack(){
        quackable.quack();
    }

}

//特殊的鸭子不仅会叫还会飞
public class SpecialDuck extends Duck {

    public SpecialDuck(Quackable quackable, Flyable flyable) {
        this.quackable = quackable;
        this.flyable = flyable;
    }

    public void setQuackable(Quackable quackable) {
        this.quackable = quackable;
    }

    public void setFlyable(Flyable flyable) {
        this.flyable = flyable;
    }

    private Quackable quackable;

    private Flyable flyable;

    @Override
    public void display() {
        System.out.println("special display");
    }

    public void quack(){
        quackable.quack();
    }

    public void fly(){
        flyable.fly();
    }
}

//测试
  public static void main(String[] args) {
        //这种new 创建对象一般都是面向实现编程
        //后续我们会用到工厂方法来对客户端代码解耦
        //把会变化的代码部分提取出来 独立变化
        Quackable gentleQuack = new GentleQuack();
        Quackable  harshQuack = new HarshQuack();
        Flyable slowFly = new SlowFly();
        Flyable quickFly = new QuickFly();
        GeneralDuck generalDuck = new GeneralDuck(gentleQuack);
        generalDuck.display();
        generalDuck.quack();
        SpecialDuck specialDuck = new SpecialDuck(gentleQuack,slowFly);
        specialDuck.display();
        specialDuck.fly();
        specialDuck.quack();

        System.out.println("------");
        specialDuck.display();
        specialDuck.setFlyable(quickFly);
        specialDuck.setQuackable(harshQuack);
        specialDuck.quack();
        specialDuck.fly();

    }

----- 输出
gentle display
warm quack
special display
slow fly
warm quack
------
special display
harsh quack
quick fly
上面可以看到特殊的鸭子既会飞 也会叫 ,飞 和 叫都有两种方式
我们通过set不同的实现到特殊鸭子类就可以动态的改变特殊鸭子的行为,这就是策略模式
上一篇 下一篇

猜你喜欢

热点阅读