设计模式---策略模式(组合)

策略模式(通过组合封装算法,把一些特性委托给别人处理)
一、定义:定义算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(算法也可以理解为某一行为特性)

  • 继承的好处:让共同部分,可以复用.避免重复编程.
  • 继承的不好:耦合性高.一旦超类添加一个新方法,子类都继承,拥有此方法,若子类相当部分不实现此方法,则要进行大批量修改.此外,采用继承时,子类就不可继承其它类了.
  • 接口的好处:解决了继承耦合性高的问题.且可让实现类,继承或实现其它类或接口.
  • 接口的不好:不能真正实现代码的复用.可用以下的策略模式来解决.没增加一个特性就需要增加一个接口的实现

在构造方法中对属性进行赋值与用属性的setter的区别:
构造方法中对属性进行赋值:固定,不可变;
用属性的setter,可以在实例化对象后,动态的变化,比较灵活。

设计原则:
1、找出应用中可能需要变化之处、把他们独立出来,不要把他们和不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程
3、多用组合,少用继承


类之间的关系
是一个:继承
有一个:组合
 

//目标类
public abstract class Duck {
     QuackBehavior quackBehavior;
     FlyBehavior flyBehavior;


     public Duck() {
     }
     public abstract void display();
     //把一些特性委托给别人实现
     public void performFly() {
          flyBehavior.fly();
     }
     public void performQuack() {
          quackBehavior.quack();
     }
     public void swim() {
          System.out.println("swimming.....");
     }
     //使用set进行赋值
     public void setQuackBehavior(QuackBehavior quackBehavior) {
          this.quackBehavior = quackBehavior;
     }
     public void setFlyBehavior(FlyBehavior flyBehavior) {
          this.flyBehavior = flyBehavior;
     }
}
//目标类的一个实现
public class MallardDuck extends Duck {

     //使用构造函数赋值
     public MallardDuck() {
          quackBehavior = new Quack();
          flyBehavior = new Flywithwings();
     }

     @Override
     public void display() {
          System.out.println("i am a real MallardDuck.....");

     }

}

//行为1的接口及其实现
public interface QuackBehavior {
     public void quack();
}

public class Quack implements QuackBehavior {

     @Override
     public void quack() {
          System.out.println("quack.....");

     }

}
public class NuteQuack implements QuackBehavior {

     @Override
     public void quack() {
          System.out.println("silence.....");
     }

}

//行为2的接口及其实现
public interface FlyBehavior {
     public void fly();
}
public class Flynoway implements FlyBehavior {

     @Override
     public void fly() {
          System.out.println("fly no way.....");

     }

}
public class Flywithwings implements FlyBehavior {

     @Override
     public void fly() {
          System.out.println("fly with wings.....");

     }

}
//测试
public class T {

     /**
      * @param args
      */
     public static void main(String[] args) {
          Duck mallard = new MallardDuck();
          mallard.performFly();
          mallard.performQuack();

     }

}
结果:
fly with wings.....
quack.....

参考:

《head first 设计模式》

http://www.importnew.com/23503.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值