java设计模式学习(二)策略模式

来源:互联网 发布:photoshop软件破解版 编辑:程序博客网 时间:2024/06/06 19:28

这里写图片描述
概念:
The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
策略模式定义了一组算法,各自封装,并且可以互相替代。策略算法使得算法和使用算法的客户端非常的独立。也就是实现了算法和使用环境的解耦。

概括一下就是三个词:行为 环境 解耦
类图
这里写图片描述

角色分析:
Strategy:a family of algorithms的父接口或抽象父类
ConcreteStrategy:a family of algorithms,封装了具体的算法。
Context:即”clients that use it”,持有一个Strategy的引用。可以具体实例化为一个ConcreteStrategy

举例
这个例子是实现商场购物一组优惠算法,包括满额现金赠送、满额减免、折扣、满额积分赠送。为了节省篇幅具体算法没有实现,只是做了一个打印。

/**  Strategy*/public abstract class PromotionStrategy { public void promote() { }}
/** ConcreteStrategy1*/public class Derate extends PromotionStrategy { public void promote() {  System.out.println("减免"); }}
/** ConcreteStrategy2*/public class Discount extends PromotionStrategy { public void promote() {  System.out.println("打折"); }}
/**ConcreteStrategy3*/public class RewardCash extends PromotionStrategy { public void promote() {  System.out.println("现金赠送"); }}
/** ConcreteStrategy4*/public class RewardCredits extends PromotionStrategy { public void promote() {  System.out.println("积分赠送"); }}
/**Context*/public class Client { PromotionStrategy strategy; public Client(PromotionStrategy strategy){  this.strategy = strategy; } public static void main(String[] args) {  Client client = new Client(new Discount());  client.strategy.promote(); }}

这样就实现了一组算法的抽象。

适用场景
多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

0 0