设计模式——如何抽象,如何使得功能容易扩展
2014-12-07 16:57
357 查看
/** * Created by smallstrong on 14-12-7. */ public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; //可以通过set方法来初始化接口对象,更加灵活,即通过参数控制初始化问题 public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } public Duck(){} public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void swim(){ System.out.println("All ducks can swim"); } }
public interface FlyBehavior { public void fly(); }
public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("I can not fly"); } }
public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("I am can flying"); } }
public interface QuackBehavior { public void quack(); }
public class MuteQuack implements QuackBehavior { @Override public void quack() { System.out.print("I can not Quack,silence!"); } }
public class Quack implements QuackBehavior { @Override public void quack() { System.out.println("Quack"); } }
public class MallarDuck extends Duck { public MallarDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } @Override public void display() { System.out.println("i am really MallarDuck"); } }
public class TestDuck { public static void main(String[] args){ Duck duck = new MallarDuck(); duck.performFly(); duck.performQuack(); } }
条件:假设有些鸭子会飞,有些鸭子不会;有些鸭子会叫,有些不会叫声不同,有些不会。其他的行为基本不会变化。
解析:根据分析可知鸭子的飞行行为和鸭子的叫声是经常会变化的,而游泳是所有鸭子都会的行为,因此我们应该把需求经常变的独立出来,不要将和不变的搅在一起。而鸭子的所有行为可以在Duck抽象类中以组合的方式组合,而到底实例化哪个类根据传递的参数决定,从而更加灵活的解决了多种行为的问题,降低了耦合且代码复用高。
注:组合比继承更为灵活。
图解析:
相关文章推荐
- 面向对象的抽象思想和模式设计如何连接
- 如何利用Android特点及设计模式 设计一个网络下载功能
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(1)
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
- 在eclipse或者myeclipse如何添加扩展名称为dtd文件以此来使得xml文件具有提醒功能
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(3)
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(2)
- 如何使用三层架构设计模式去完整的实现一个功能?
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
- 设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(3)
- JSP设计模式基础:View Helper模式——学习如何使用View Helper模式使得Model数据适应表现层的需要(3)
- [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库
- 《实时设计模式——实时系统的强壮的、可扩展的体系结构》
- 如何学习设计模式初级篇
- 如何将多种设计模式结合使用(源代码)
- 设计模式学习笔记(一)——Abstract Factory抽象工厂