package firstPro;
/*headfirst 设计模式第一章节 策略模式,模拟鸭子游戏,由于鸭子的颜色种类固定,不经常变动,所以把颜色相关函数放在超类Duck中,由于
鸭子的fly和kua两个行为经常要变更,或者增加新的表现行为,大致先用以下两种方案:
方案一:如果把该行为也放在Duck超类,以后每添加一个新行为,则所有子类都会继承该行为,包括那些不想添加该行为的子类,牵一发而动全身
方案二:如果把该行为分别写在每一个鸭子子类中(如GreenDuck)则每一个子类都要单独写一个行为实现方法,而这些方法是有重复的,比如两
种鸭子的飞行方式一样,但是要写两次。
所以出现方案三,也就是策略模式,把经常发生变化(增加或者删除)的行为单独放在另一个分支,通过把鸭子的行为与鸭子分开,形成算法簇
设计模式原则:多用组合,少用继承
*/
abstract class Duck //超类鸭子类,甭管什么鸭子都要从这里继承鸭子属性和方法
{
FlyBehave flybehave;
KuaBehave kuabehave;
abstract public void display(); //抽象方法,所有子类必须提供该方法具体实现,因为鸭子的外貌必须要有
public void setFly(FlyBehave flybehavior) //给外部提供一个接口可以实现动态改变flybehave的值,也就是动态改变鸭子飞行行为
{
this.flybehave = flybehavior; //这里用到了多态,在运行时动态的改变鸭子行为
}
public void performFly() //表现鸭子飞行的特征,这里用到了
{
this.flybehave.Fly(); //同样用到了多态,动态的根据鸭子飞行方式的类型来表现飞行特征
}
public void setKua(KuaBehave kuabehavior) //给外部提供一个接口可以实现动态改变kuabehave的值,也就是动态改变鸭子叫的行为
{
this.kuabehave = kuabehavior;
}
public void performKua()
{
this.kuabehave.Kua();
}
}
class GreenDuck extends Duck //创建一个稍微具体的鸭子类型,继承自超类Duck,名绿鸭子
{
public GreenDuck() //在构造函数内部一定要实现鸭子飞行行为与叫的行为,否则该鸭子实例化后就没有指定行为
{
this.flybehave = new FlyWithWings(); //指定绿鸭子用翅膀 飞
this.kuabehave = new Qiqi(); //指定绿鸭子唧唧叫
}
public void display()
{
System.out.println("im a green duck"); //指定绿鸭子的外观为一个绿色的鸭子
}
}
interface FlyBehave //关于鸭子飞行行为的接口,实现该接口才可实现具体飞行行为
{
public void Fly(); //接口声明一个鸭子飞行行为的函数
}
class FlyWithWings implements FlyBehave //该类实现了鸭子飞行的一个行为,用翅膀飞行
{
public void Fly()
{
System.out.println("im flying with wings");
}
}
class NoFly implements FlyBehave //该类实现了鸭子飞行的一个行为,不会飞
{
public void Fly()
{
System.out.println("i can't fly");
}
}
interface KuaBehave //关于鸭子叫的接口,实现该接口才可实现具体叫的行为
{
public void Kua();
}
class Qiqi implements KuaBehave //该类实现了鸭子叫的一个行为,唧唧叫
{
public void Kua()
{
System.out.println("i make sound with qiqi");
}
}
class Kuakua implements KuaBehave //该类实现了鸭子叫的一个行为,呱呱叫
{
public void Kua()
{
System.out.println("i make sound with kuakua");
}
}
class NoKua implements KuaBehave 该类实现了鸭子叫的一个行为,不会叫
{
public void Kua()
{
System.out.println("i can't make sound");
}
}
class CHello
{
public static void main(String[] args)
{
Duck greenduck = new GreenDuck(); //实例化一个绿鸭子
greenduck.display(); //展现鸭子的外观
greenduck.performFly(); //鸭子展现下飞行方式
greenduck.setFly(new NoFly()); //设置鸭子的飞行方式为不会飞
greenduck.performFly(); //再次展现鸭子飞行方式,结果是不会飞
}
}