深入浅出设计模式学习笔记一:设计模式简介以及策略模式
设计模式
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 }
运行结果: