策略模式

来源:互联网 发布:小米看电视直播软件 编辑:程序博客网 时间:2024/06/05 17:05

一、策略模式包含三种对象:

        1、环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
        2、抽象策略对象:它可由接口或抽象类来实现。
        3、具体策略对象:它封装了实现同不功能的不同算法。
二、设计原则:
        把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子

实现代码如下:

package com.tiger.strategy;/** * 旅游策 略接口 * @author tiger * */public interface TravelStrategy {/** *  * @param person  姓名 * @param attraction  景点 */public void travel(Person person,String attraction);}package com.tiger.strategy;/** * 单车策略 * @author tiger * */public class MobikeStrategy implements TravelStrategy {@Overridepublic void travel(Person person, String attraction) {System.out.println( person.name+" 使用单车去 " + attraction + " 旅行。");}}package com.tiger.strategy;/** * 火车策略 * @author tiger * */public class TrainStrategy implements TravelStrategy {@Overridepublic void travel(Person person, String attraction) {System.out.println( person.name+" 使用火车去 " + attraction + " 旅行。");}}package com.tiger.strategy;/** * 旅行者 * @author tiger  * */public class Person {//Person的属性String name;//Person出去旅行的策略TravelStrategy travelStrategy;//Person出去旅行的景点String attraction;//Person构造器,初始化在构造器中处理,也可以单独处理,如下面注释的 2 个方法。public Person(String name,TravelStrategy travelStrategy,String attraction ) {this.name = name;this.travelStrategy = travelStrategy;this.attraction = attraction;}//public Person(String name) {super();this.name = name;}//策略的选择可以在构造器中设置,也可以在travel中设置,也可以单独提供一个方法//public void setTravelStrategy(TravelStrategy travelStrategy) {//this.travelStrategy = travelStrategy;//}//public void travel(TravelStrategy travelStrategy) {//this.travelStrategy = travelStrategy;////this表示当前对象//this.travelStrategy.travel(this,attraction);//}public void travel() {//this表示当前对象travelStrategy.travel(this,attraction);}}package com.tiger.strategy;public class StrategyTest {public static void main(String[] args) {TravelStrategy mobikeStrategy = new MobikeStrategy();TravelStrategy travelStrategy = new TrainStrategy();TravelStrategy carStrategy = new CarStrategy();Person person1 = new Person("李先森 ",mobikeStrategy," 北京");person1.travel();//person1.travel(carStrategy);//将第一个设置的旅行策略值覆盖掉System.out.println("-----------------------------");Person person2 = new Person("林先森 ",travelStrategy," 山海");person2.travel();//person2.travel(carStrategy);}}
原创粉丝点击