策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
(差不多应该是不固定模块的分离)
当涉及“维护”时,为了“复用”(reuse)目的而使用继承,结局并不完美。
设计原则:
找出应用中可能需要变化之外,把他们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出来“封装”起来,好让其他部分不会受到影响。
结果如何?代码变化引起的不经意后果变少,系统变得更有弹性。
把会变化的部分取出并合并封装起来,一遍以后可以轻易地改变活扩充此部分,而不影响不需要变化的部分。
这样的概念很简单,几乎是每个设计模块必须的军规。
针对接口编程,而不是针对实现编程。
引入了一个新的概念:“行为”类。怎么说呢,就打里面鸭子的例子,把鸭子的飞行和叫的具体实现,
再做一份基础的接口来,然后单独去实现,还能提高各种情况的复用性。
如:
绿色的鸭子
关键在于,鸭子现在会将飞行和呱呱叫的动作“委托”(delegate)别人处理,而不是使用定义在duck类(或子类)内的呱呱叫和飞行方法。
DEMO:
基本就是把鸭子的飞行和叫声单独抽取出来,然后在不改变鸭子类的前提下,还可以改变他的叫声和飞行。
(差不多应该是不固定模块的分离)
当涉及“维护”时,为了“复用”(reuse)目的而使用继承,结局并不完美。
设计原则:
找出应用中可能需要变化之外,把他们独立出来,不要和那些不需要变化的代码混在一起。
把会变化的部分取出来“封装”起来,好让其他部分不会受到影响。
结果如何?代码变化引起的不经意后果变少,系统变得更有弹性。
把会变化的部分取出并合并封装起来,一遍以后可以轻易地改变活扩充此部分,而不影响不需要变化的部分。
这样的概念很简单,几乎是每个设计模块必须的军规。
针对接口编程,而不是针对实现编程。
引入了一个新的概念:“行为”类。怎么说呢,就打里面鸭子的例子,把鸭子的飞行和叫的具体实现,
再做一份基础的接口来,然后单独去实现,还能提高各种情况的复用性。
如:
- public class Duck{
- QuackBehavior quackBehavior; //一个接口,也就是我们分离出来的行为接口
- public void performQuack(){
- quackBehavior.quck();//具体实现类是狗叫还是鸭子叫,是执行的时候才确定的,当然我们就可以利用spring或者ejb简单的来实现这种效果。
- }
- }
绿色的鸭子
- public class MallardDuck extends Duck{
- public MallardDuck(){
- quackBehavior = new Quack();
- fly.....
- }
- }
关键在于,鸭子现在会将飞行和呱呱叫的动作“委托”(delegate)别人处理,而不是使用定义在duck类(或子类)内的呱呱叫和飞行方法。
组合:行为不是继承而来的,而是和适当的行为对象“组合”来的。
DEMO:
基本就是把鸭子的飞行和叫声单独抽取出来,然后在不改变鸭子类的前提下,还可以改变他的叫声和飞行。
- package cn.partner4java.demo1.duck;
- /**
- * 飞
- * @author partner4java
- *
- */
- public interface FlyBehavior {
- /**
- * 飞行动作
- */
- public void fly();
- }
- package cn.partner4java.demo1.duck;
- /**
- * 叫声
- * @author partner4java
- *
- */
- public interface QuackBehavior {
- public void quack();
- }
- package cn.partner4java.demo1.duck;
- public abstract class Duck {
- protected FlyBehavior flyBehavior;
- protected QuackBehavior quackBehavior;
- public Duck(){
- }
- public abstract void display();
- public void performFly(){
- flyBehavior.fly();
- }
- public void performQuack(){
- quackBehavior.quack();
- }
- public void swin(){
- System.out.println("All ducks float,even decoys!");
- }
- public void setFlyBehavior(FlyBehavior flyBehavior) {
- this.flyBehavior = flyBehavior;
- }
- public void setQuackBehavior(QuackBehavior quackBehavior) {
- this.quackBehavior = quackBehavior;
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.FlyBehavior;
- /**
- * 不会飞
- * @author partner4java
- *
- */
- public class FlyNoWay implements FlyBehavior {
- public void fly() {
- System.out.println("I can't fly");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.FlyBehavior;
- /**
- * 会飞的鸭子
- * @author partner4java
- *
- */
- public class FlyWithWings implements FlyBehavior {
- public void fly() {
- System.out.println("I'm flying!");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.QuackBehavior;
- public class Quack implements QuackBehavior {
- public void quack() {
- System.out.println("Quack");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.QuackBehavior;
- public class Squeak implements QuackBehavior {
- public void quack() {
- System.out.println("Squeak");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.Duck;
- public class ModelDuck extends Duck {
- public ModelDuck(){
- flyBehavior = new FlyNoWay();
- quackBehavior = new Quack();
- }
- @Override
- public void display() {
- System.out.println("I'm a model duck");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.QuackBehavior;
- public class MuteQuack implements QuackBehavior {
- public void quack() {
- System.out.println("<Silence>");
- }
- }
- package cn.partner4java.demo1.duck.impl;
- import cn.partner4java.demo1.duck.Duck;
- public class Test {
- public static void main(String[] args) {
- Duck duck = new ModelDuck();
- duck.performFly();
- duck.performQuack();
- System.out.println("---");
- duck.setQuackBehavior(new MuteQuack());
- duck.performFly();
- duck.performQuack();
- // 后台打印:
- // I can't fly
- // Quack
- // ---
- // I can't fly
- // <Silence>
- }
- }