发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
策略模式(Strategy Patern),是把针对同一件事情的不同的算法分别封装起来,并且相互之间可以替换。这种模式的使用需要以下三种角色:
(1)环境角色:应用不同的策略来达到完成某件事情的目的;
(2)抽象策略角色:通常由接口或者抽象类实现,所有的具体角色都继承此抽象;
(3)具体策略角色:具体的算法实现;
相对来说,例子还是挺多的,比如淘宝搜索的时候,是按照卖出量排序还是价格排序还是好评度排序等等。
前面的几种模式都是拿手机做例子,那还是继续手机做例子吧。
现在的智能手机基本上都是大屏幕,看着花里胡哨的很爽。流行的手机操作系统都支持换屏幕主题的功能。不同的Theme有着不同的背景图、图标、字体。用户还能自定义特殊癖好的主题。
首先来个接口,所有的手机主题都必须实现此接口:
1 package org.scott.strategy; 2 /** 3 * @author Scott 4 * @date 2013年12月22日 5 * @description 6 */ 7 public interface Theme { 8 public void backGround(); 9 public void fontStyle(); 10 public void smsRing(); 11 }
接口中定义了三个方法,分别是背景图片、字体类型、通知铃声。有了抽象策略角色,下面就实现两个具体的主题策略:
1 package org.scott.strategy; 2 /** 3 * @author Scott 4 * @date 2013年12月22日 5 * @description 6 */ 7 public class ClassficTheme implements Theme { 8 9 @Override 10 public void backGround() { 11 System.out.println("Back ground image is: 水墨中国.jpeg."); 12 } 13 14 @Override 15 public void fontStyle() { 16 System.out.println("Font style is: 正楷."); 17 } 18 19 @Override 20 public void smsRing() { 21 System.out.println("The sms ring is: 春江花月夜"); 22 } 23 24 }
再来个现代风格的主题:
1 package org.scott.strategy; 2 /** 3 * @author Scott 4 * @date 2013年12月22日 5 * @description 6 */ 7 public class ModernTheme implements Theme { 8 9 @Override 10 public void backGround() { 11 System.out.println("Back ground image is: 奇幻星空.jpeg."); 12 } 13 14 @Override 15 public void fontStyle() { 16 System.out.println("Font style is: 静蕾体."); 17 } 18 19 @Override 20 public void smsRing() { 21 System.out.println("The sms ring is: Nohthing In The World."); 22 } 23 24 }
有了抽象策略和具体策略,还差个Context角色:
1 package org.scott.strategy; 2 /** 3 * @author Scott 4 * @date 2013年12月22日 5 * @description 6 */ 7 public class Context { 8 private Theme theme; 9 10 public void setTheme(Theme theme) { 11 this.theme = theme; 12 } 13 14 public void getTheme(){ 15 theme.backGround(); 16 theme.fontStyle(); 17 theme.smsRing(); 18 } 19 }
我们来个手机设定个Theme吧,看看我们的客户端代码:
1 package org.scott.strategy; 2 /** 3 * @author Scott 4 * @date 2013年12月22日 5 * @description 6 */ 7 public class StrategyClient { 8 9 public static void main(String[] args) { 10 Context theme = new Context(); 11 theme.setTheme(new ClassficTheme()); 12 theme.getTheme(); 13 } 14 }
执行结果呢?
Back ground image is: 水墨中国.jpeg. Font style is: 正楷. The sms ring is: 春江花月夜
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间没有依赖。
并且,在运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。就像我们的例子,只能使用一个主题,这个可以理解,你只有一个手机,一个屏幕~
最后上个经典的类图吧(源自网络):
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
java设计模式———策略模式
java设计模式———策略模式 ava设计模式之——策略模式。策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式属于对象行为...
java设计模式精讲 Debug 方式+内存分析 第19章 策略模式讲解
/** 我们来创建一个promotionKey */ String promotionKey = "LIJIAN"; if (StringUtils.equals(promotionKey, "LIJIAN&q...
设计模式之策略模式和状态模式(strategy pattern & state pattern)
设计模式之策略模式和状态模式(strategy pattern & state pattern)状态模式中的状态之间有关联,并且状态本身控制着状态转移;状态模式的核心是将对象每一个状态做的事情分别交给每一个单独的状...
策略模式.
策略模式.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到...
9.3 默认适配器模式
9.3 默认适配器模式实现。
《JAVA与模式》之状态模式
public class Client { public static void main(String[] args){ //创建状态 State state = new ConcreteStateB(); //创建环境 Context context = new Context(); //将状态设置到环境中 context.setSt...
模板方法模式——每日的生活行为
模板方法模式。
23种设计模式详解(五)
public class Test { public static void main(String[] args){ State state=new State();public class Prototype implements Clo...
设计模式之创建者模式
public classPerson {public voidsetHead(String head) {public voidsetBody(String body) {public voidsetLeg(String leg) {public voi...
微信扫码,在手机上查看选中内容