Java设计模式之策略模式

什么是策略模式

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

策略模式的结构

        策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.
        策略模式由三方参与: 1. 策略接口--定义所有支持的算法的公共接口 2. 具体策略--实现某具体的算法 3. 策略的应用环境---持有一个策略对象的引用.

使用场景
  • 策略接口
//车票策略接口
public  interface ITicketStrategy{ 
     //策略方法
     public double  calcPrice(double ticketPrice);
} 
  • 具体策略实现类
//商务票策略 
public class BusinessTicketStrategy implements ITicketStrategy {
      @Override                                              
      public double calcPrice(double ticketPrice) {     
              System.out.println("商务座票价:"+ticketPrice); 
              return ticketPrice;   
      }                  
}
 //一等坐票策略
 public class TopRateTicketStrategy implements ITicketStrategy {
     @Override 
     public double calcPrice(double ticketPrice) {  
            System.out.println("一等坐票价:"+ticketPrice*0.9);   
            return ticketPrice*0.9; 
     }     
}  
//二等坐票策略   
public class SecondRateTicketStrategy implements ITicketStrategy {    
    @Override
    public double calcPrice(double ticketPrice) {         
          System.out.println("二等座票价:"+ticketPrice*0.8);    
          return ticketPrice*0 .8;   
    }    
}
  • 策略应用环境
 // 价格类--不同的策略产生不同的价格 
public class Price {  
    //策略对象 
    private ITicketStrategy ticketStrategy;      
    //传入一个具体的策略对象     
    public Price(ITicketStrategy ticketStrategy){  
          this.ticketStrategy = ticketStrategy;    
    }  
    //计算车票价格  
    public double execute(double ticketPrice){    
          return this.ticketStrategy.calcPrice(ticketPrice);    
    }     
}
  • 客户端
public class Client { 
      public static void main(String[] args) {   
          //创建策略对象              
          ITicketStrategy ticketStrategy = new BusinessTicketStrategy(); 
          //创建应用环境 
          Price price = new Price(ticketStrategy);  
          //计算价格 
          double quote = price.execute(400);
          System.out.println(quote);  
    }    
}                
认识策略模式
  1. 策略模式仅仅封装算法,提供算法的变更 ,不决定何时使用何种算法,在什么情况下使用什么算法由客户端决定
  2. 各个策略算法之间是平等的,他们之间可以相互替换
  3. 使用策略模式可以动态地让一个对象在许多行为中选择一种行为
策略模式的优点
  1. 策略模式提供了管理相关的算法族的办法,可以将公共的代码移到父类里,从而避免重复的代码
  2. 使用策略模式可以避免使用多重条件转移语句.多重转移语句不易维护,他把采取哪一种算法的逻辑与算法的逻辑混合在一起.
策略模式的缺点
  1. 客户端必须知道所有的策略类,并自行决定使用那一个策略,策略模式只适用于客户端知道所有的算法的情况.
  2. 策略模式会造成很多的策略类.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342