策略模式(通过组合封装算法,把一些特性委托给别人处理)
一、定义:定义算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(算法也可以理解为某一行为特性)
- 继承的好处:让共同部分,可以复用.避免重复编程.
- 继承的不好:耦合性高.一旦超类添加一个新方法,子类都继承,拥有此方法,若子类相当部分不实现此方法,则要进行大批量修改.此外,采用继承时,子类就不可继承其它类了.
- 接口的好处:解决了继承耦合性高的问题.且可让实现类,继承或实现其它类或接口.
- 接口的不好:不能真正实现代码的复用.可用以下的策略模式来解决.没增加一个特性就需要增加一个接口的实现
在构造方法中对属性进行赋值与用属性的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 设计模式》