策略模式
针对同一任务有多个不同的实现,在运行时,选择一种特定的算法实现。
特征
- 有多个算法实现
- 在运行时,针对不同情况,动态选择不同实现
UML
image.png定义
在策略模式中,我们创建一个有抽象的算法的接口,然后创建这个抽象算法的具体实现,这个叫做策略。
客户端总是调用抽象方法,然后传递给要给上下文对象,这个上下文对象决定使用哪个算法。
场景
我们来设计一个社交应用,它会允许我连接在4个社交平台上的我的朋友们,比如: Facebook、Google Plus、Twitter 、Orkut。现在我想这个 client 能够应该能够告诉我,朋友的名字和所需要的平台。
总的说来,我有一个操作,这个操作可以有多种方式实现(连接我的朋友),在运行时,用户可以选择一个期望的方式。
- ISocialMediaStrategy 包含抽象操作的接口
- SocialMediaContext 具体使用哪个具体实现的上下文
- Implementations 各种各样的 ISocialMediaStrategy 实现,比如 FacebookStrategy、GooglePlusStrategy、TwitterStrategy、TwitterStrategy。
类图
image.pngISocialMediaStrategy
public interface ISocialMediaStrategy {
public void connectTo(String friendName);
}
SocialMediaContext
public class SocialMediaContext {
ISocialMediaStrategy smStrategy;
public void setSocialmediaStrategy(ISocialMediaStrategy smStrategy)
{
this.smStrategy = smStrategy;
}
public void connect(String name)
{
smStrategy.connectTo(name);
}
}
FacebookStrategy
public class FacebookStrategy implements ISocialMediaStrategy {
public void connectTo(String friendName)
{
System.out.println("Connecting with " + friendName + " through Facebook");
}
}
GooglePlusStrategy
public class GooglePlusStrategy implements ISocialMediaStrategy {
public void connectTo(String friendName)
{
System.out.println("Connecting with " + friendName + " through GooglePlus");
}
}
TwitterStrategy
public class TwitterStrategy implements ISocialMediaStrategy {
public void connectTo(String friendName)
{
System.out.println("Connecting with " + friendName + " through Twitter");
}
}
OrkutStrategy
public class OrkutStrategy implements ISocialMediaStrategy {
public void connectTo(String friendName)
{
System.out.println("Connecting with " + friendName + " through Orkut [not possible though :)]");
}
}
Client
public class Demo {
public static void main(String[] args) {
// Creating social Media Connect Object for connecting with friend by
// any social media strategy.
SocialMediaContext context = new SocialMediaContext();
// Setting Facebook strategy.
context.setSocialmediaStrategy(new FacebookStrategy());
context.connect("Lokesh");
System.out.println("====================");
// Setting Twitter strategy.
context.setSocialmediaStrategy(new TwitterStrategy());
context.connect("Lokesh");
System.out.println("====================");
// Setting GooglePlus strategy.
context.setSocialmediaStrategy(new GooglePlusStrategy());
context.connect("Lokesh");
System.out.println("====================");
// Setting Orkut strategy.
context.setSocialmediaStrategy(new OrkutStrategy());
context.connect("Lokesh");
}
}
流行的实现
- Java Collections.sort(list, comparator) method where client actually passes suitable comparator based on the requirement in runtime to the method and the method is generic to accept any comparator type. Based on the comparator being passed, same collection can be sorted differently.
- Appenders, Layouts and Filters in Log4j.
- 在 MyBatis 中, DefaultSqlSession 中使用到了策略模式, DefaultSqlSession 扮演了 Context 的角色,而将所有数据库相关的操作全部封装到 Executor 接口实现中,并通过 executor 字段选择不同的 Executor 实现,比如 BatchExecutor、SimpleExecutor、ReuseExecutor 等。
网友评论