设计模式思考

designpattern.png

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

  • 策略模式
    策略模式定义了算法族,分别封装起来,让他们之间可以互换,这个模式让算法的变化独立于使用算法的客户。有三个重点,第一,把代码中变化的部分抽离出来集中维护,第二,面向接口编程,这样可以动态增加服务,第三,多用组合,少用继承。一般客户代码中不是去继承某个类型,而是运用组合添加一个变量,在构造方法或者通过set方法进行构造这个对象,当然这个对象一般是一个接口或者基类,注入时注入的是对应的实现,这样就可以动态的替换算法。
    接下来我们用书上的例子来看一下,策略模式的应用。


    image.png
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不同的实现到特殊鸭子类就可以动态的改变特殊鸭子的行为,这就是策略模式
  • 观察者模式
    观察者模式就是很多订阅者像主题进行订阅,当主题状态发生变化的时候会通知所有的订阅者,要实现这样的设计就需要面向接口编程,不能面向实现,这样当新增一个订阅者,这个订阅者只是实现订阅者接口,然后向主题进行注册就行了,主题状态变化只是去遍历订阅者集合,去发送通知就ok了,这是一种松耦合的设计,面向接口编程,为交互对象之间的松耦合设计而努力。

  • 装饰者模式
    装饰者模式动态的把责任附加到对象上,若要扩展功能装饰者提供了比继承更有弹性的替代方案。首先,装饰者和被装饰者有相同的超类,我们可以使1个或者多个装饰者包装一个对象,也就是动态的附加多个方法或者说功能,因为装饰者和被装饰者用相同的超类,所以在任何时刻需要原始对象的场合(被包装对象)都可以用装饰者代替。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,984评论 1 15
  • 续 设计模式思考 II 思考方式:1.这种模式怎么理解?(尽量简单易懂)2.类图怎样画?(代码怎样写)3.举个栗子...
    cfanr阅读 1,355评论 0 11
  • *续 设计模式思考 I * 思考方式:1.这种模式怎么理解?(尽量简单易懂)2.类图怎样画?(代码怎样写)3.举个...
    cfanr阅读 2,681评论 2 23
  • 前言 最近复习设计模式,花了不少时间,由于项目经验还比较少,虽然看得懂,能理解,但鉴于个人比较偏实践,不善于记忆,...
    cfanr阅读 4,346评论 0 47
  • 我们经常需要把UIView的背景色设置为渐变色,虽然找一张渐变的背景图很方便,但是图片是要占用资源的,所以我们最好...
    程序猿小武阅读 626评论 0 0