设计模式是人们在面对同类型的软件工程设计问题所总结出来的一些有用经验,模式不是代码,而是某类问题的通用设计方案
public abstract class Duck { public void Quack() { System.out.println("~~gaga~~"); } public abstract void display(); public void swim() { System.out.println("~~im swim~~"); } }
public class GreenHeadDuck extends Duck { @Override public void display() { System.out.println("**GreenHead**"); } }
1、添加新的需求:要求鸭子会飞,面向对象的解决方案是
public abstract class Duck { ...; public void Fly() { System.out.println("~~im fly~~"); } }
这样设计的问题:
使用面向对象解决:
public class GreenHeadDuck extends Duck { ...; public void Fly() { System.out.println("~~no fly~~"); } }
public interface FlyBehavior { void fly(); } public interface QuackBehavior { void quack(); }
好处:新增行为简单,行为类更好的复用,组合方便,既有继承带来的复用好处
public abstract class Duck { FlyBehavior mFlyBehavior; QuackBehavior mQuackBehavior; public Duck() { } public void Fly() { mFlyBehavior.fly(); } public void Quack() { mQuackBehavior.quack(); } public abstract void display(); } }
public class GreenHeadDuck extends Duck { public GreenHeadDuck() { mFlyBehavior = new GoodFlyBehavior(); mQuackBehavior = new GaGaQuackBehavior(); } @Override public void display() {...} }
策略模式:分别封装行为接口实现算法族,在子类中具体设定行为对象,原则就是:分离变化接口,封装接口,基于接口编程,此模式让行为算法的变化独立于算法的使用者
使用注意点:
1、分析项目的变化部分和不变化部分
2、多用组合,少用继承,用行为类组合,而不是行为的继承,更有弹性
3、设计模式有没有相应的库直接使用,有些库或框架本身就用某种设计模式的
4、如果找不到使用的模式怎么办