设计模式思考

作者: freelands | 来源:发表于2017-12-13 14:21 被阅读56次
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个或者多个装饰者包装一个对象,也就是动态的附加多个方法或者说功能,因为装饰者和被装饰者用相同的超类,所以在任何时刻需要原始对象的场合(被包装对象)都可以用装饰者代替。

相关文章

  • 设计模式的思考

    思考设计模式

  • 设计模式总目录

    写最好的设计模式专栏 【设计模式总结】对常用设计模式的一些思考(未完待续。。。) 一句话设计模式

  • 设计模式思考

    记得大三的时候第一次接触设计模式,觉得很cool,当时把head first 设计模式看了一遍,才知道原来代码还能...

  • 设计模式

    一、设计模式简介及分类#### 所谓模式,就是套路、固定的代码。对于设计模式,重要的是思维和思考方式的转变。 创建...

  • 单例设计模式

    设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编码风格、以及解决问题的思考方式 单例设计模式 ...

  • 设计模式思考 I

    前言 最近复习设计模式,花了不少时间,由于项目经验还比较少,虽然看得懂,能理解,但鉴于个人比较偏实践,不善于记忆,...

  • 设计模式思考 II

    *续 设计模式思考 I * 思考方式:1.这种模式怎么理解?(尽量简单易懂)2.类图怎样画?(代码怎样写)3.举个...

  • 设计模式思考 III

    续 设计模式思考 II 思考方式:1.这种模式怎么理解?(尽量简单易懂)2.类图怎样画?(代码怎样写)3.举个栗子...

  • 设计模式的思考

    使用好设计模式可以提高软件的扩展性。 首先,设计软件要有组件化的思维,定义好一个组件要做什么样的职责。 设计模式最...

  • 漫谈设计模式在 Spring 框架中的良好实践

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计...

网友评论

    本文标题:设计模式思考

    本文链接:https://www.haomeiwen.com/subject/xgsaixtx.html