java 设计模式之2策略模式( 二 )


实现接口:
/*吱吱叫 */public class Squeak implements QuackBehavior{@Overridepublic void quack(){System.out.println("Ican Sequack!");}}
Quack叫实现接口:
/*瓜瓜叫*/public class Quackimplements QuackBehavior {public void quack(){System.out.println("I can Quack!");}}
一个子类鸭子:
/*这是一直会吱吱叫和会飞行的鸭子*/public class OneFlyDuck2 extends Duck {public OneFlyDuck2() {quackBehavior = new Squeak(); //flyBehavior = new FlyWithWings(); // 用翅膀飞行}}
测试类:
public static void main(String[] args) {Duck oneflyDuck2=new OneFlyDuck2();FlyBehavior flyBehavior=new FlyWithWings(); //翅膀飞行QuackBehavior quackBehavior1=new Squeak(); //吱吱方式叫oneflyDuck2.performFlyBehavior();;//这种事oneFlyDuck 构造方式创建的oneflyDuck2.performQuackBehavior();}
结果:
2.2 第二次编码改进
上方是通过子类构造器方式实例化鸭子具有的行为,这样比较僵硬,有一种方式可以动态地set设定鸭子的行为,方式如下:**
在Duck类中新增set方法,设定具体的飞的行为or叫的行为,然后子类中不需要构造了 。

java 设计模式之2策略模式

文章插图
新Duck类:
/*鸭子都有的固定的属性或者行为*/public class Duck {FlyBehavior flyBehavior;//声明两个行为QuackBehavior quackBehavior;//都会游泳public void swim(){System.out.println("I can swim");};// 游泳public void performFlyBehavior(){flyBehavior.fly();}public void performQuackBehavior(){quackBehavior.quack();}//新增的方法public void setFlyBehavior(FlyBehavior flyBehavior1){this.flyBehavior=flyBehavior1;}public void setQuackBehavior(QuackBehavior quackBehavior1){this.quackBehavior=quackBehavior1;}}
新子类:
/*这是某一种鸭子*/public class OneFlyDuck extends Duck{}
测试类:
public static void main(String[] args) {Duck oneflyDuck=new OneFlyDuck();FlyBehavior flyBehavior=new FlyWithWings(); //翅膀飞行父类接口指向子类引用QuackBehavior quackBehavior1=new Squeak(); //吱吱方式叫父类接口指向子类引用oneflyDuck.setFlyBehavior(flyBehavior);//传递会飞的行为oneflyDuck.setQuackBehavior(quackBehavior1); //传递会叫的行为 。oneflyDuck.performFlyBehavior();//执行飞的行为oneflyDuck.performQuackBehavior();//执行叫的行为}
结果:
2.3额外补充
如果新增一只鸭子,他是用火箭实现飞行的,那么只需要新建一个火箭飞行类实现接口,而不需要修改原有代码.
/*新增加的飞行方式*/public class RocketFly implements FlyBehavior{@Overridepublic void fly(){System.out.println("I can fly with Rocket!!");}}
测试:
public static void main(String[] args) {Duck duckRocket=new OneRocketDuck();FlyBehavior flyBehavior2=new RocketFly(); //实例化 使用火箭飞的行为duckRocket.setFlyBehavior(flyBehavior2);//设定飞的行为 是通过火箭方式duckRocket.performFlyBehavior();//执行fly}
代码的执行过程:
是指向子类的父类引用,因为多态特性,因此可以调用在Duck类中的方法 。
是指向子类的父接口引用,将作为参数传入方法,就是实例化了Duck类中的 。
最后使用调用方法,就是执行了.fly(),因为多态,且已经第二步实例化了,因此调用的就是中的fly方法 。