策略模式——国庆游厦门

中秋灾难过后,厦门逐渐恢复生机,随着国庆脚步临近,不少旅行者开始考虑放假七天到厦门旅游。
那么今天我们就来谈谈到厦门的,旅游策略


教科书定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

简单举例,就是,有一项工作,这项工作是分为三个环节完成(三个环节相互独立,同等重要),但是这三个环节中的每一个环节都可以有多种实现方式。
我们要做的就是,让这项工作的完成方式,多种多样,随意替换

下面代码见:


今天的主角类型:
1、TravelStrategy类(主策略类)
2、三类抽象接口Ieat、Ilive、Ivehicle
3、Ieat、Ilive、Ivehicle的不同接口实现类


首先是: 三个抽象接口Ieat、Ilive、Ivehicle

//定义"吃"接口
public interface IeatBehavior {

    public void eat();

}
//定义"住"接口
public interface IliveBehavior {

    public void live();
}
//定义"出行"接口
public interface IvehicleBehavior {

    public void vehicle();
}

其次是,TravelStrategy旅行策略类

//旅行策略,包含吃、住、出行
public class TravelStrategy {

    public String name;
    private IeatBehavior mEat;
    private IliveBehavior mLive;
    private IvehicleBehavior mVehicle;

    //构造函数,传入旅行者姓名
    public TravelStrategy(String traveler) {
        this.name = traveler;
    }

    //传入实现接口的具体实例
    public void setEatBehavior(IeatBehavior eatbehavior) {
        this.mEat = eatbehavior;
        // return this; // (若返回this本类,则可在Test中链式编程)
    }

    //传入实现接口的具体实例
    public void setLiveBehavior(IliveBehavior livebehavior) {
        this.mLive = livebehavior;
        // return this; // (若返回this本类,则可在Test中链式编程)
    }

    //传入实现接口的具体实例
    public void setVehicleBehavior(IvehicleBehavior vehiclebehavior) {
        this.mVehicle = vehiclebehavior;
        // return this; // (若返回this本类,则可在Test中链式编程)
    }

    // 执行实例传入的吃
    public void eat() {
        mEat.eat();
    }

    // 执行实例传入的住
    public void live() {
        mLive.live();
    }

    // 执行实例传入的出行
    public void vehicle() {
        mVehicle.vehicle();
    }
}

最后,是实现了相应接口的具体实例类:

//具体的“吃”行为
public class EatGingerDuck implements IeatBehavior {

    @Override
    public void eat() {
        System.out.println("吃姜母鸭");
    }

}
//具体的“吃”行为
public class EatSeafood implements IeatBehavior {

    @Override
    public void eat() {
        System.out.println("吃海鲜");
    }

}
//具体的“住”行为
public class LiveIsland implements IliveBehavior {

    @Override
    public void live() {
        System.out.println("住鼓浪屿");
    }

}
//具体的“住”行为
public class LiveSeaside implements IliveBehavior {

    @Override
    public void live() {
        System.out.println("住环岛路");
    }

}
//具体的“出行”行为
public class VehicleBus implements IvehicleBehavior {

    @Override
    public void vehicle() {
        System.out.println("乘观光巴士出行");
    }

}
//具体的“出行”行为
public class VehicleShip implements IvehicleBehavior {

    @Override
    public void vehicle() {
        System.out.println("乘轮渡游艇出行");
    }

}

大功告成,写个测试类Test试试

public class Test {

    public static void main(String[] args) {

        // 创建 旅行者策略实例,如需改变吃、住、出行,只需改变不同的接口便可
        TravelStrategy traveler = new TravelStrategy("郑成功");
        traveler.setEatBehavior(new EatSeafood());
        traveler.setLiveBehavior(new LiveIsland());
        traveler.setVehicleBehavior(new VehicleShip());

        // 测试执行
        System.out.println(traveler.name);
        traveler.eat();
        traveler.live();
        traveler.vehicle();
    }
}

控制台输出结果

郑成功
吃海鲜
住鼓浪屿
乘轮渡游艇出行

如果我们想让郑爷换一种方式游厦门
只需要改动Test中传入的接口,比如

public class Test {

    public static void main(String[] args) {

        // 创建 旅行者策略实例,如需改变吃、住、出行,只需改变不同的接口便可
        TravelStrategy traveler = new TravelStrategy("郑成功");
        // traveler.setEatBehavior(new EatSeafood());
        // traveler.setLiveBehavior(new LiveIsland());
        // traveler.setVehicleBehavior(new VehicleShip());
        traveler.setEatBehavior(new EatGingerDuck());
        traveler.setLiveBehavior(new LiveSeaside());
        traveler.setVehicleBehavior(new VehicleBus());

        // 测试执行
        System.out.println(traveler.name);
        traveler.eat();
        traveler.live();
        traveler.vehicle();
    }
}

控制台输出就变为:

郑成功
吃姜母鸭
住环岛路
乘观光巴士出行

好了,到此为止,想让郑爷吃好料,住豪宅,小伙伴们就自己敲敲代码试一试吧


献上源码:

http://download.csdn.net/detail/lebang08/9634722

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值