深入浅出设计模式学习笔记一:设计模式简介以及策略模式

设计模式

1、定义:是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结

2、优点:代码复用,易于维护,易于理解性,保证代码的可靠性

3、分类:设计模式分为3种类型,共23种模式 

  创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

4、软件设计的6大原则:

  1)开闭原则(Open Closed Principle,OCP)

    开闭原则指的是对扩展开放,对修改关闭。

  2) 迪米特法则(最小知识原则)(Principle of Least Knowledge,PLK)

  3)里氏代换原则(Liskov Substitution Principle,LSP)

  4)依赖倒转原则(Dependency Inversion Principle,DIP)

  5)接口隔离原则(Interface Segregation Principle,ISP)

  6)单一职责原则 (SRP Single responsibility principle)

设计模式背后所秉承的精神所在是很多的设计原则:

1、把会变化的部分取出来并封装起来,以便以后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分

2、针对接口编程,而不是针对实现编程

3、多用组合,少用继承:组合就是将两个类结合起来使用,使用组合建立系统具有很大的弹性

设计模式:

1、策略模式(Strategy Pattern):策略模式定义了算法族,并将其分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

 组成:

 举例说明:鸭子模拟器的设计

  1 /**
  2  * 所有飞行行为必须实现的接口
  3  */
  4 interface FlyBehavior {    
  5     public void fly();
  6 }
  7 /**
  8  * 所有呱呱叫行为必须实现的接口
  9  */
 10 interface QuackBehavior {    
 11     public void quack();
 12 }
 13 /**
 14  * 飞行行为的具体实现1:可以飞行
 15  */
 16 class FlyWithWings implements FlyBehavior {
 17     @Override
 18     public void fly() {        
 19         System.out.println("I am flying!");        
 20     }    
 21 }
 22 /**
 23  * 飞行行为的具体实现2:不会飞行
 24  */
 25 class FlyNoWay implements FlyBehavior{
 26     @Override
 27     public void fly() {
 28         System.out.println("I can not fly!");    
 29     }    
 30 }
 31 /**
 32  * 呱呱叫行为的具体实现1:呱呱叫
 33  */
 34 class Quack implements QuackBehavior{
 35 
 36     @Override
 37     public void quack() {
 38         System.out.println("Quack");        
 39     }    
 40 }
 41 /**
 42  * 呱呱叫行为的具体实现2:吱吱叫
 43  */
 44 class Squeak implements QuackBehavior{
 45     @Override
 46     public void quack() {
 47         System.out.println("Squeak");        
 48     }    
 49 }
 50 /**
 51  * 抽象类,是所有鸭子的超类,在该类中,定义了行为类型接口的引用变量
 52  */
 53 abstract class Duck{
 54     
 55     FlyBehavior flyBehavior;
 56     QuackBehavior quackBehavior;
 57     
 58     public void setFlyBehavior(FlyBehavior flyBehavior) {
 59         this.flyBehavior = flyBehavior;
 60     }
 61     public void setQuackBehavior(QuackBehavior quackBehavior) {
 62         this.quackBehavior = quackBehavior;
 63     }
 64     
 65     public abstract void dispaly();
 66     
 67     //将鸭子的行为实现委托给行为类    
 68     public void fly(){
 69         flyBehavior.fly();
 70     }
 71     
 72     public void quack(){
 73         quackBehavior.quack();
 74     }
 75 }
 76 
 77 /**
 78  * 定义model duck子类继承超类duck,并实现超类中的抽象方法
 79  */
 80 class ModelDuck extends Duck{
 81     
 82     public ModelDuck(){
 83         
 84         flyBehavior = new FlyNoWay(); 
 85         quackBehavior = new Quack();
 86     }     
 87     @Override
 88     public void dispaly() {
 89         System.out.println("I am a model duck!");
 90     }    
 91 }
 92 /**
 93  * 测试类
 94  */
 95 public class TestModel{
 96     
 97     public static void main(String[] args) {
 98         
 99         Duck model = new ModelDuck();
100         model.fly();
101         model.quack();
102         System.out.println("动态更改行为---");
103         //调用鸭子的setter方法,在运行时改变鸭子的行为
104         model.setFlyBehavior(new FlyWithWings());
105         model.setQuackBehavior(new Squeak());
106         model.fly();
107         model.quack();
108         
109     }
110     
111 }
View Code

 运行结果:

原文地址:https://www.cnblogs.com/miaowu1314/p/5364331.html