ps:
面向接口编程,而不是面向实现编程。
多用组合,少用继承。
策略模式,可复用、又可变更。
策略模式中的设计原则,
1、组合一个策略对象,将飞行行为代理给该对象的实现
交由飞行策略接口,由飞行实现去完成
FlyStragedy:FlyWithRocket、FlyNoWay、FlyWithWing(多态)
2、面向接口,而不是面向工程实现
接口提供契约,规范总体框架
3、多用组合,少用继承
策略模式的实现要点:
1、分离变化,得出策略接口;
2、写出多个该接口的实现类;
3、客户程序持有一个策略接口;
4、在客户程序中选择/组装正确的策略实现(注入)。
优点:
1、使用组合,架构更加灵活;
2、富有弹性,可较好地应对变化(开闭原则);
3、更换的代码复用性(相对于继承);
4、消除大量的条件语句,可读性,面向对象易于维护。
缺点:
1、客户代码需要了解每个策略实现的细节;
每个客户代码都需要注入一个策略实现。
2、增加了对象的数目,要写多个实现类,增加了维护的困难。
适用场景:
1、许多相关的类仅仅是行为差异;
2、运行时选取不同的算法变体;
3、通过调节语句在多个分支选取其一。
1.抽象基类
package com.test.strategymodel;
/**
* 抽象基类
* @author Administrator
*
*/
public abstract class Duck {
/*
* 显示鸭子的外观 鸭子的外观各不相同,声明为abstract, 由子类实现
*/
public abstract void display();
/*
* 鸭子发出叫声 通用行为,由超类实现
*/
public void say() {
System.out.println("嘎嘎嘎");
}
public void fly() {
// 调用接口方法
flyStragetyInterface.performFly();
}
// 组合关联 接口
private FlyStragetyInterface flyStragetyInterface;
public void setFlyStragetyInterface(FlyStragetyInterface flyStragetyInterface) {
this.flyStragetyInterface = flyStragetyInterface;
}
}
2.MallardDuck
package com.test.strategymodel;
public class MallardDuck extends Duck{
public MallardDuck() {
// TODO Auto-generated constructor stub
//设置具体的飞行接口实现
super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Win());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("显示出一只绿头鸭");
}
}
3.RedheadDuck
package com.test.strategymodel;
public class RedheadDuck extends Duck {
public RedheadDuck() {
// TODO Auto-generated constructor stub
//设置具体的飞行接口实现
super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Win());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("显示出一只红头鸭");
}
}
4.FlyStragetyInterface
package com.test.strategymodel;
public interface FlyStragetyInterface {
void performFly();
}
5.impl
package com.test.strategymodel;
public class FlyStragetyInterfaceImpl4NoFly implements FlyStragetyInterface{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("不会飞");
}
}
6.impl
package com.test.strategymodel;
public class FlyStragetyInterfaceImpl4Win implements FlyStragetyInterface{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("用翅膀飞");
}
}
7.impl
package com.test.strategymodel;
public class FlyStragetyInterfaceImpl4Rocket implements FlyStragetyInterface{
@Override
public void performFly() {
// TODO Auto-generated method stub
System.out.println("用火箭飞");
}
}
8.
package com.test.strategymodel;
public class RubberDuck extends Duck{
public RubberDuck() {
// TODO Auto-generated constructor stub
//RubberDuck 不会飞
super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4NoFly());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("显示出一只RubberDuck");
}
//这里表现出say方法是有缺陷的 因为不是必须要覆盖的
@Override
public void say() {
// TODO Auto-generated method stub
//super.say();
System.out.println("G~G~G~");
}
}
9.
package com.test.strategymodel;
public class BigYellowDuck extends Duck{
public BigYellowDuck() {
// TODO Auto-generated constructor stub
//大黄鸭不会飞
super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4NoFly());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("显示出一只大黄鸭");
}
}
10.
package com.test.strategymodel;
public class SpaceDuck extends Duck {
public SpaceDuck() {
// TODO Auto-generated constructor stub
super.setFlyStragetyInterface(new FlyStragetyInterfaceImpl4Rocket());
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("显示出一只SpaceDuck");
}
@Override
public void say() {
System.out.println("我通过无线电say");
}
}
11.test
package com.test.strategymodel;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Duck duck = new MallardDuck();最原始的方式
// Duck duck = new RedheadDuck();//与MallardDuck一致
// Duck duck =new BigYellowDuck();//不会飞
// Duck duck =new RubberDuck();//不会飞 改变叫声
Duck duck = new SpaceDuck();// 改变飞行方式 改变叫声
//
duck.display();
duck.say();
duck.fly();
}
}