策略模式(Strategy Pattern)
来源:互联网 发布:剑灵捏脸数据图人男 编辑:程序博客网 时间:2024/05/29 16:49
- 先从一个例子说起….
首先有一个系统内部设计使用了标准的OO技术,设计了一个鸭子超类(superclass)。并让各种鸭子继承此超类。
产品经理提出了新的需求,引入了会飞的鸭子....,对于一个OO程序员来说,这有什么困难的了,只要在鸭子超类 (Duck)中加入fly()方法就可以了。可是这样的话,所有的鸭子就都会飞了...,可以在不需要飞行的鸭子子类中 重写fly()方法...,这样也是可以的,只是如果不会飞的鸭子子类有50多个,这样就需要在50多个类中重写 fly()方法了,这样的设计显然不是合理的。
对于这样的问题,可以将fly()方法从鸭子超类中抽取出来,单独写一个接口Flyable.
在这里,只考虑两种情况,会飞和不会飞,写两个子类继承Flyable接口,实现fly()方法。
以前的做法是:行为来自Duck类的具体实现,这种做法太依赖于"实现",我们被实现绑的死死的,没办法更改行为。 在新的设计中,将使用鸭子的子类所表示的行为,这样就不会被"实现"绑死。 来看下重新设计的Duck类
让Duck持有Flyable接口,加入performFly()和setFlyable(Flyable fly)方法 performFly(){ flyAble.fly();//调用接口中的fly()方法 } setFlyable(Flyable fly){ this.flyAble = fly;//这样就可以动态的设置Flyable类的具体实现子类了,对于父类来说这是透明的 }
再看下现在的鸭子子类的实现
这样将行为委托给flyAble来处理,同时加入的setFlyable(Flyable fly)方法可以动态改变行为 GreenDuck duck = new GreenDuck(); duck.performFly();//飞行 duck.setFlyable(new FlyNoWay()); duck.performFly();//不会飞行
这就是策略模式,定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
0 0
- 策略模式(Strategy Pattern)
- 策略模式(Strategy Pattern)
- 策略模式 Strategy Pattern
- 策略模式(Strategy Pattern)
- 策略模式(Strategy Pattern)
- Strategy Pattern (策略模式)
- 策略模式 Strategy Pattern
- 策略模式【Strategy Pattern】
- 策略模式(Strategy Pattern)
- Strategy Pattern(策略模式)
- 策略模式(STRATEGY PATTERN )
- 策略模式(Strategy Pattern)
- 策略模式Strategy Pattern
- 策略模式(Strategy Pattern)
- 策略模式【Strategy Pattern】
- 策略模式【Strategy Pattern】
- 策略模式Strategy Pattern
- Strategy Pattern策略模式
- JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
- Codeforce 731A. Night at the Museum
- Qt视频播放器
- 当你在浏览器中输入Google.com并且按下回车之后发生了什么?
- COBOL Pointer variable
- 策略模式(Strategy Pattern)
- 用C++11的std::async代替线程的创建
- 用ADC连续采集11路模拟信号,并由DMA传输到内存
- Web页面切图和CSS注意事项
- 给定两个字符串a和b,判断b是否是a的子序列,例如a=”abndjs“,b=“and”则返回ture,如果b=”adn“,那么返回false
- COBOL call printf system library function
- 寻迹小车的报告
- 科研搜索引擎
- 【Python3自学笔记4】—Python内置的有序集合list和tuple