今天看一个《head first design pattern》 书的第一章。发觉这本书真的和别人说的一样的是一本好书呀。难怪获得JOLT大奖。
策略模式:就是把不变的东西封装,把变的东西通过代理实现,下面的例子是原书的例子
假设我们要设计一个鸭子游戏,那我们设计一个超类Duck
Duck 有这些属性(是一个抽象类)
quack()
swim()
display()
// 外观是绿头 } // 鸭子的其他方法
MallardDuck继承了Duck
display() ... {
// 外观是绿头 }
RedheadDuck继承了Duck
display() ...{
// 外观是红头 }
由于某些原因要让有的鸭子会叫和会飞,一开始想在Duck超类上添加fly()和quack();看上去好想没有什么问题,但是所有的鸭子都会fly()和quack()吗?想想也是呀假鸭和聋哑就不会quack
而且每一只鸭的fly和quack可能不一样那么怎么解决了。引用策略模式():
把fly的行为封装在FlyBehavior接口,同样把quack的行为封装在QuackBehavior接口
public abstract class Duck ...{
FlyBehavior fl yBehavior;
QuackBehavior quackBehavior;
public Duck() ...{
}
public abstract void display();
public void performFly() ...{
fl yBehavior.fl y();
}
public void performQuack() ...{
quackBehavior.quack();
}
public void swim() ...{
System.out.println(“All ducks fl oat, even decoys!”);
}
}
这里用到了oo的多态
继承Duck类的子类在实例化通过set##方法来把quackBehavior,QuackBehavior的实例动态加载
flybeh
FlyBehavior的行为不一定只能给鸭,给鸡给鸟呀QuackBehavior也是同样的
上面的就是strategy pattern
其实我有个想法(实现上面的问题的方法):
public abstract class Duck ...{
public Duck() ...{
}
public abstract void display();
public adstract void performFly();
public abstarct void performQuack() ;
public void swim() ...{
System.out.println(“All ducks fl oat, even decoys!”);
}
}
策略模式:就是把不变的东西封装,把变的东西通过代理实现,下面的例子是原书的例子
假设我们要设计一个鸭子游戏,那我们设计一个超类Duck
Duck 有这些属性(是一个抽象类)
quack()
swim()
display()
// 外观是绿头 } // 鸭子的其他方法
MallardDuck继承了Duck
display() ... {
// 外观是绿头 }
RedheadDuck继承了Duck
display() ...{
// 外观是红头 }
由于某些原因要让有的鸭子会叫和会飞,一开始想在Duck超类上添加fly()和quack();看上去好想没有什么问题,但是所有的鸭子都会fly()和quack()吗?想想也是呀假鸭和聋哑就不会quack
而且每一只鸭的fly和quack可能不一样那么怎么解决了。引用策略模式():
把fly的行为封装在FlyBehavior接口,同样把quack的行为封装在QuackBehavior接口
public abstract class Duck ...{
FlyBehavior fl yBehavior;
QuackBehavior quackBehavior;
public Duck() ...{
}
public abstract void display();
public void performFly() ...{
fl yBehavior.fl y();
}
public void performQuack() ...{
quackBehavior.quack();
}
public void swim() ...{
System.out.println(“All ducks fl oat, even decoys!”);
}
}
这里用到了oo的多态
继承Duck类的子类在实例化通过set##方法来把quackBehavior,QuackBehavior的实例动态加载
flybeh
FlyBehavior的行为不一定只能给鸭,给鸡给鸟呀QuackBehavior也是同样的
上面的就是strategy pattern
其实我有个想法(实现上面的问题的方法):
public abstract class Duck ...{
public Duck() ...{
}
public abstract void display();
public adstract void performFly();
public abstarct void performQuack() ;
public void swim() ...{
System.out.println(“All ducks fl oat, even decoys!”);
}
}