Java23种设计模式之策略模式
2016-07-15 17:12
369 查看
策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
介绍
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
策略模式代码实现:
1.Bicycle.java 自行车类
package com.test.design.model.strategy;
public class Bicycle implements IWay{
@Override
public void doSelect() {
System.out.println("骑自行车");
}
@Override
public void forHelp() {
System.out.println("坐单车");
}
}
2.Car.java 汽车类
package com.test.design.model.strategy;
public class Car implements IWay{
@Override
public void doSelect() {
System.out.println("开车");
}
@Override
public void forHelp() {
System.out.println("让老司机带");
}
}
3.Plane.java 飞机类
package com.test.design.model.strategy;
public class Plane implements IWay{
@Override
public void doSelect() {
System.out.println("开飞机");
}
@Override
public void forHelp() {
System.out.println("乘飞机");
}
}
4.IWay.java 出行方式接口 ,接口中有选择出行方式的方法。(该接口继承了IExtraWay 额外出行方式接口)
package com.test.design.model.strategy;
public interface IWay extends IExtraWay {
public void doSelect();
}
5.IExtraWay.java额外出行方式接口 ,该接口中有寻求帮助的出行方式
package com.test.design.model.strategy;
public interface IExtraWay {
public void forHelp();
}
6.Person.java 人物类 (人物),人物类中有选择出行方式的技能
package com.test.design.model.strategy;
public class Person {
private IWay way;
public Person(IWay way) {
this.way = way;
}
public void operate() {
this.way.doSelect();
}
public void help() {
this.way.forHelp();
}
}
7.TestStrategy.java测试策略类
package com.test.design.model.strategy;
public class TestStrategy {
public static void main(String[] args) {
Person person = new Person(new Bicycle());
person.operate();
person.help();
person = new Person(new Car());
person.
b3c1
operate();
person.help();
person = new Person(new Plane());
person.operate();
person.help();
}
}
运行结果
骑自行车
坐单车
开车
让老司机带
开飞机
乘飞机
相关文章推荐
- JAVA虚拟机:Java内存模型
- 基于Spring解决jsp传值乱码问题 get post
- JAVA中String类的intern()方法的作用
- struts2拦截器
- 使用Eclipse快速创建父子聚合工程
- SVN服务器和客户端的安装以及在MyEclipse中的配置
- Java获取当前系统时间System.currentTimeMillis()
- spring+cxf
- java excel通过浏览器下载
- java大数问题
- 深入理解JAVA多态原理
- Java Web学习(16):JSP动作元素(一)
- 快速了解Java 线程
- Java多线程用法
- java string类型转换boolean类型
- eclipse 创建maven项目设置默认jdk版本
- QRCode生成二维码(java)
- java 实现城市联动查询天气预报
- SpringBoot依赖积累
- Spring4.1新特性——异步调度和事件机制的异常处理