Java设计模式:策略模式

先看一个虚拟业务场景,现在有俩种支付方式:微信和支付宝,价钱小于2000使用微信支付,大于2000使用支付宝支付。

第一次代码实现

微信支付操作类:

public class WeixinPay {
    public  void pay() {
        System.out.println("使用微信支付");
  }
}

支付宝支付操作类:

public class AliPay {
    public void pay() {
        System.out.println("使用支付宝支付");
  }
}

客户端测试类:

public class MainTest {
    static final int PRICE = 1000;   
    public static void main(String[] args) {
        if (PRICE > 0 && PRICE < 2000) {
            WeixinPay weixinPay = new WeixinPay();
            weixinPay.pay();
        } else {
            AliPay aliPay = new AliPay();
            aliPay.pay();
        }
    }
}

上面的代码可不可以进行一些优化呢,答案是肯定的

  • 微信支付和支付宝支付可以实现同一个支付接口,实现多态
  • 客户端调用支付接口的时候是不应该考虑具体规则的,比较好的是把支付规则隐藏起来,客户端传一个具体的价格就可以完成支付

第二次代码实现

定义支付接口:

public interface Pay {
    void pay(); }

微信支付操作类:

public class WeixinPay implements Pay {
    public  void pay() {
        System.out.println("使用微信支付");
  }
}

支付宝支付操作类:

public class AliPay implements Pay {
    public void pay() {
        System.out.println("使用支付宝支付");
  }
}

为了隐藏选择支付方式的规则,选择建立一个上下文环境PayContext

public class PayContext {
    private static Pay aliPay = new AliPay();
    private static Pay weixinPay = new WeixinPay();
    
    public static void pay(int price) {
        if (price > 0 && price < 2000) {
            weixinPay.pay();
        } else {
            aliPay.pay();
        }
    }
}

客户端测试类:

public class MainTest {
    public static void main(String[] args) {
        PayContext payContext = new PayContext();
        payContext.pay(1000);
        payContext.pay(2500);
  }
}

策略模式

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

特点:

  • 定义了一族算法(业务规则)
  • 封装了每个算法
  • 这族算法可以互相替代

结合上面的业务场景,对象具有的某个行为指的就是支付行为,但是根据不同的情况需要使用不同的支付方式,这个就相当于不同的算法实,行为相同实现不同,这正是接口的作用。个人认为策略模式真正的核心是策略这俩个字,就是什么时候选择什么样的算法实现,这个选择过程一般是在Context里实现,这个选择过程当然也可以放在客户端调用的时候,只是这样用起来很不方便,支付的时候直接调用一个方法更方便,更优雅,耦合度更低,代码分工更明确,如果修改支付规则,直接修改Context即可。

附上Wiki代码示例:

//StrategyExample test application

class StrategyExample {

    public static void main(String[] args) {

        Context context;

        // Three contexts following different strategies
        context = new Context(new FirstStrategy());
        context.execute();

        context = new Context(new SecondStrategy());
        context.execute();

        context = new Context(new ThirdStrategy());
        context.execute();

    }

}

// The classes that implement a concrete strategy should implement this

// The context class uses this to call the concrete strategy
interface Strategy {

    void execute();

}

// Implements the algorithm using the strategy interface
class FirstStrategy implements Strategy {

    public void execute() {
        System.out.println("Called FirstStrategy.execute()");
    }

}

class SecondStrategy implements Strategy {

    public void execute() {
        System.out.println("Called SecondStrategy.execute()");
    }

}

class ThirdStrategy implements Strategy {

    public void execute() {
        System.out.println("Called ThirdStrategy.execute()");
    }

}

// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {

    Strategy strategy;

    // Constructor
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {
        this.strategy.execute();
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,151评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,465评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,429评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,147评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,149评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,614评论 1 315
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,965评论 3 429
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,950评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,486评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,524评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,640评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,228评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,976评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,407评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,552评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,215评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,714评论 2 366

推荐阅读更多精彩内容

  • 定义 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可...
    步积阅读 770评论 0 2
  • 定义 Define a family of algorithms,encapsulate each one,and...
    tianranll阅读 348评论 0 2
  • 一、定义 策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使...
    怡红快绿阅读 887评论 0 0
  • 今天给大家说说田忌赛马的故事。如有雷同,纯属巧合!话说在战国时期,群雄割据,硝烟四起,茶余饭后还是少不了娱乐活动的...
    Jet啟思阅读 5,510评论 4 17
  • 在我们需要实现一个功能的时候,可以有多种算法来实现的时候,我们可以使用if...else或者case来选择对应的算...
    MrKing5946阅读 224评论 0 0