策略设计模式

策略设计模式是一种行为设计模式,在该模式中,我们在运行时从特定的算法或任务中选择特定的实现方式。

重要的一点是,这些实现是可互换的–根据任务可以选择一种实现而不会干扰应用程序工作 Stream 程。

目录
 简介
设计参与者
带有策略设计模式的问题陈述
解决方案
代码实施
演示
 popular 实施
摘要

介绍

策略模式包括从其宿主类中删除算法并将其放在单独的类中,以便在同一编程上下文中可能存在不同的算法(即策略),可以在运行时选择它们。

策略模式使客户端代码可以从一系列相关但不同的算法中进行选择,并提供了一种简单的方法来根据客户端上下文在运行时选择任何算法。

由开/关原理驱动

此模式基于“ 打开/关闭”原理。我们不需要修改上下文(关闭修改),但是可以选择并添加任何实现(打开扩展)。

例如,在Collections.sort()–我们不需要更改排序方法即可获得不同的排序结果。我们可以在运行时提供不同的比较器。

阅读更多:比较器示例

设计参加者

在策略模式中,我们首先创建算法的抽象。这是具有抽象操作的接口。然后,我们创建此抽象的实现,这些实现称为策略。

客户端将始终调用抽象,并将传递上下文对象。该上下文对象将决定使用哪种策略。

策略模式参与者
策略模式参与者

问题陈述

让我们解决一个设计问题,以更详细地了解策略模式。

我想设计一个社交媒体应用程序,使我可以在四个社交平台(例如Facebook,Baidu Plus,Twitter和Orkut)上与朋友联系。现在,我希望该客户端能够告诉朋友的名称和所需的平台-然后我的应用程序应该透明地连接到他。

更重要的是,如果我想在应用程序中添加更多社交平台,则应用程序代码应在不破坏设计的情况下容纳它。

具有策略设计模式的解决方案

在上述问题中,我们有一个可以以多种方式(连接到朋友)完成的操作,用户可以在运行时选择所需的方式。因此,它是策略设计模式的理想选择。

要实施该解决方案,让我们一次设计一个参与者。

  • ISocialMediaStrategy –抽象操作的接口。
  • SocialMediaContext –确定实现的上下文。
  • 实现 –的各种实现ISocialMediaStrategy。例如FacebookStrategyBaiduPlusStrategyTwitterStrategyOrkutStrategy

类图

策略模式类图
策略模式类图

代码实施

现在,让我们在设计参与者之上进行编码。

ISocialMediaStrategy.java

package com.how2codex.designpattern.strategy;

public interface ISocialMediaStrategy 
{
	public void connectTo(String friendName);
}

SocialMediaContext.java

package com.how2codex.designpattern.strategy;

public class SocialMediaContext 
{
	ISocialMediaStrategy smStrategy;

	public void setSocialmediaStrategy(ISocialMediaStrategy smStrategy) 
	{
		this.smStrategy = smStrategy;
	}

	public void connect(String name) 
	{
		smStrategy.connectTo(name);
	}
}

Facebook策略.java

package com.how2codex.designpattern.strategy.impl;

import com.how2codex.designpattern.strategy.ISocialMediaStrategy;

public class FacebookStrategy implements ISocialMediaStrategy {

	public void connectTo(String friendName) 
	{
		System.out.println("Connecting with " + friendName + " through Facebook");
	}
}

BaiduPlusStrategy.java

package com.how2codex.designpattern.strategy.impl;

import com.how2codex.designpattern.strategy.ISocialMediaStrategy;

public class BaiduPlusStrategy implements ISocialMediaStrategy {

	public void connectTo(String friendName) 
	{
		System.out.println("Connecting with " + friendName + " through BaiduPlus");
	}
}

TwitterStrategy.java

package com.how2codex.designpattern.strategy.impl;

import com.how2codex.designpattern.strategy.ISocialMediaStrategy;

public class TwitterStrategy implements ISocialMediaStrategy {

	public void connectTo(String friendName) 
	{
		System.out.println("Connecting with " + friendName + " through Twitter");
	}
}

OrkutStrategy.java

package com.how2codex.designpattern.strategy.impl;

import com.how2codex.designpattern.strategy.ISocialMediaStrategy;

public class OrkutStrategy implements ISocialMediaStrategy {

	public void connectTo(String friendName) 
	{
		System.out.println("Connecting with " + friendName + " through Orkut [not possible though :)]");
	}
}

Demo

现在看看如何在运行时中使用这些策略。

package com.how2codex.designpattern.strategy.demo;

import com.how2codex.designpattern.strategy.SocialMediaContext;
import com.how2codex.designpattern.strategy.impl.FacebookStrategy;
import com.how2codex.designpattern.strategy.impl.BaiduPlusStrategy;
import com.how2codex.designpattern.strategy.impl.OrkutStrategy;
import com.how2codex.designpattern.strategy.impl.TwitterStrategy;

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 BaiduPlus strategy.
		context.setSocialmediaStrategy(new BaiduPlusStrategy());
		context.connect("Lokesh");

		System.out.println("====================");

		// Setting Orkut strategy.
		context.setSocialmediaStrategy(new OrkutStrategy());
		context.connect("Lokesh");
	}
}

输出:

通过Facebook与Lokesh联系
====================
通过Twitter与Lokesh连接
====================
通过BaiduPlus与Lokesh联系
====================
通过Orkut与Lokesh进行连接[虽然无法实现:)]

热门实现

  1. Collections.sort(list, comparator)客户端实际上根据运行时的要求将适当的比较器传递给该方法的Java 方法,并且该方法通用以接受任何比较器类型。根据传递的比较器,可以对同一集合进行不同的排序。
  2. Log4j中的 Appender,布局和过滤器。
  3. UI工具箱中的布局管理器。

摘要

  • 此模式定义了一组相关算法,并将它们封装在单独的类中,并允许客户端在运行时选择任何算法。
  • 它允许添加新算法而无需修改使用算法或策略的现有算法或上下文类
  • 策略是“四个设计的帮派”列表中的一种行为模式。
  • 策略模式基于SOLID主体的开放式封闭设计原则。
  • Collections.sort()和Comparator接口的组合是Strategy模式的可靠示例。

这就是关于战略设计模式的一切。如果您有任何疑问,请在评论区留言,我会一一解答。

学习愉快!

saigon has written 1440 articles

Leave a Reply