1、第一个设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。该原则几乎是所有设计模式背后的精神所在。

  这个原则的另一种思考方式:把会变化的部分取出并封装起来,以便以后可以轻易改动或扩充此部分,二不影响不需要变化的其他部分。

2、第二个设计原则:针对接口编程,而不是针对实现编程。

3、第三个设计原则:多用组合,少用继承

4、策略模式(Strategy Pattern):模拟鸭子

  策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立与使用算法的客户。

  Duck

public abstract class Duck {
// 关系 has a
protected FlyBehavior flyBehavior;// 封装飞行行为
protected QuackBehavior quackBehavior;// 封装呱呱叫行为 public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
} // 动态设定行为
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
} public void swim() {
System.out.println("所有的鸭子都会游泳");
} public abstract void display();
}

  飞行行为(算法)

public interface FlyBehavior {
void fly();
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("哈哈。我有翅膀,我会飞。。。");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("什么都不做,不会飞");
}
}

  呱呱叫行为(算法)

public interface QuackBehavior {
void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("呱呱叫");
}
}
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("吱吱叫");
}
}
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("什么都不做,不会叫");
}
}

  MallardDuck

public class MallardDuck extends Duck {

    public MallardDuck() {
this.flyBehavior = new FlyWithWings();
this.quackBehavior = new Quack();
} @Override
public void display() {
System.out.println("MallardDuck display");
} }

  

  测试:

public class Demo02 {
public static void main(String[] args) {
Duck duck = new MallardDuck();
duck.performFly();
duck.performQuack();
duck.swim();
duck.display();
System.out.println("=========动态改变行为========="); duck.setFlyBehavior(new FlyNoWay());
duck.setQuackBehavior(new MuteQuack());
duck.performFly();
duck.performQuack();
}
}

  打印结果:

哈哈。我有翅膀,我会飞。。。
呱呱叫
所有的鸭子都会游泳
MallardDuck display
=========动态改变行为=========
什么都不做,不会飞
什么都不做,不会叫

5、总结

  1)“有一个”关系:每一个鸭子都有一个FlyBehavior和QuackBehavior,好将飞行和呱呱叫委托给它们代为处理。

  当你将两个类结合起来使用,就是组合(Composition)。这种做法与“继承”不同的在于,鸭子的行为不是继承来的,而是和适当 行为对象"组合"来的。

  2)软件开发完成“前”以及完成“后”,何者花费更多时间?

  “后”。我们总需要花许多时间在系统的维护和变化上,比原先开发所花的时间更多。所以,我们应该致力于提高软件的可维护性和可扩展性。

最新文章

  1. php应用jquery做ajax操作
  2. hibernate4学习
  3. 程序中使用ajax时,type为put,或者delete时在 IIS上没效果,发生HTTP Error 405.0 - Method Not Allowed
  4. Git self-learning
  5. 错误的CPU时间片大小概念
  6. 弹性伸缩布局flex
  7. I/O扩展篇(基于74HC164/74HC165)
  8. [转载] FFMpeg的码率控制
  9. 用paint 计算字符串的像素宽度
  10. 知识点总结之HTML篇
  11. myeclipse离线安装PyDev
  12. python文件读read()、readline()、readlines()对比
  13. dubbo服务运行的三种方式
  14. banner
  15. Ubuntu 14.04 安装 CUDA 问题及解决
  16. Codeforces Gym100187C Very Spacious Office 贪心 堆
  17. CSS预处理语言
  18. vue 父子组件互相传值容易出现的报错
  19. iOS开发NSDate、NSString、时间戳之间的转化
  20. PLSQL无法粘贴复制

热门文章

  1. .NET Core和.NET Standard 区别与联系
  2. 【Spring 源码】ApplicationContext源码
  3. Mysql binlog应用场景与原理深度剖析
  4. TCP/IP 物理层卷二 -- 交换技术
  5. # 最短Hamilton路径(二进制状态压缩)
  6. redis 学习(16)-- redis 持久化
  7. tomcat搭建webDav
  8. Git复习(十二)之命令专场
  9. 12 Scrapy框架的日志等级和请求传参
  10. ccs之经典布局(二)(两栏,三栏布局)