您的位置:首页 > 编程语言 > Java开发

吹捧一下Java策略模式,策略在手,万事无忧

2016-05-26 14:20 513 查看
《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:

策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

策略模式的三个角色:

抽象策略(Strategy)角色:抽象角色,通常由接口或抽象类实现。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

环境(Context)角色:持有一个Strategy的引用。

策略模式的使用场景

策略模式的使用场景还是很广泛的,比如购物网站或者商场针对不同会员等级的会员折扣方案就是不同的策略;

废话不多说,来一个身边的例子,我是湖大的学生,我有一个高中同学来长沙玩,想要去逛岳麓书院,岳麓书院只能对于湖大的学生才免费,那么我如何带她进取参观呢?看代码!  

抽象策略角色:逛岳麓书院的策略!

public interface VisitYueluBookYard {
public void visit();
}
具体策略角色:借一张湖大同学校园卡、用他自己校园卡买半价票、直接买全价票!

public class BorrowCard implements VisitYueluBookYard{

public void visit() {
System.out.println("借了一张湖大校园卡带他参观岳麓书院");
}
}
public class UseHisCard implements VisitYueluBookYard{

public void visit() {
System.out.println("用他自己的校园卡买了一张半价票参观岳麓书院");
}
}
public class FullPriceTicket implements VisitYueluBookYard{

public void visit() {
System.out.println("直接买了一张全价票参观岳麓书院");
}
}

环境角色:在综合考虑了性价比和实际情况,选择最合适的一种策略,带他去参观岳麓书院!

public class VisitWithFriend {
private VisitYueluBookYard visitYuelu;

public VisitWithFriend(VisitYueluBookYard visitYuelu){
this.visitYuelu=visitYuelu;
}

public void visitYuelu(){
visitYuelu.visit();
}
}
升华一下策略模式

策略模式的重心,通过参观岳麓书院的例子,可知不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

策略模式的优缺点:

    这一次,我们不直接总结出来,各位一起来思考和交流,岂不是更加有趣和好玩!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: