【设计模式】1.策略设计模式

策略设计模式的定义:

策略设计模式是把每一个算法封装到具有共同接口的独立类中,具体算法之间可以相互替换或者变化,这种变化不会影响客户端。

关键词:【算法封装】 【共同接口】 【自由替换】

策略设计模式的代码:

 1     public interface IStrategy { //共同接口
 2         public void doSomething();
 3     }
 4     class ConcreteStrategyA implements IStrategy { //具体策略A(算法)
 5         public void doSomething() { //重写父类接口,实现自己的算法
 6             System.out.println("具体策略A");
 7         }
 8     }
 9     class ConcreteStrategyB implements IStrategy { //具体策略B(算法)
10         public void doSomething() {  //重写父类接口,实现自己的算法
11             System.out.println("具体策略B");
12         }
13     }
14     class Context { //环境,拥有抽象策略引用
15         private IStrategy strategy;
16
17         public Context(IStrategy strategy){ //构造函数的参数是父类接口的引用,一会儿会指向子类对象
18             this.strategy = strategy;
19         }
20
21         public void execute(){
22             strategy.doSomething(); //一会调用子类自己的方法(算法)
23         }
24     }
25
26     public class Client {
27         public static void main(String[] args){
28             Context context;
29             System.out.println("-----执行策略A-----");
30             context = new Context(new ConcreteStrategyA()); //这里就是多态,即策略设计模式的应用接口啦
31             context.execute();
32
33             System.out.println("-----执行策略B-----");
34             context = new Context(new ConcreteStrategyB());
35             context.execute();
36         }
37     }

策略设计模式的三个角色:

1. 环境context :拥有has-a 抽象策略的引用,对算法的二次封装

2. 抽象策略strategy: 是所有具体策略的父类接口,当各个实现类存在一定重复的逻辑时,可以使用抽象类,避免这种重复。

3. 具体策略: 封装了具体的算法或者行为,算法之间可以自由替换,也可以自由拓展,而不影响用户。

策略设计模式的优点:

1. 代码复用:可以把重复的算法放入抽象策略类,避免代码的重复。

2. 灵活性、扩展性: 把所有算法分离出来,自由修改、添加。

策略设计模式的缺点:

1. 开发困难:策略过多会带来开发上的麻烦。

2. 客户需要了解算法:客户必须知道每一个算法策略的具体功能,并自行决定调用哪一个算法策略。

策略设计模式的本质:

多态,即根据传入对象决定调用哪种算法,前提是用户要知道有哪些算法,以及算法的具体功能。

时间: 2024-09-29 16:10:45

【设计模式】1.策略设计模式的相关文章

设计模式之策略设计模式

一.何为策略设计模式呢? 在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容.下面让我们来看看将一个实现改成策略模式后的便捷性. 二.一个简单的示例 假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类. 1 abstract class People{ 2 abstract void playBall()

设计模式之------策略设计模式

<?php /** **策略模式:定义一系列算法,使他们可相互替换,并且算法的改变不影响使用他们的客户 *******/ interface strategy{ public function filter(); } class User implements strategy{ public function filter(){ echo 'user filter'; } }   class Enery implements strategy{ public function filter()

23种设计模式之策略设计模式

策略模式:分别封装行为接口,实现算法组,超类里放行为接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.此模式让行为算法的变化独立于算法的使用者. 策略模式注意点:1)分析项目中变化部分与不变部分:2)多用组合少用继承:用行为类组合,而不是行为的继承更有弹性. 鸭子游戏项目设计思路 一般设计是分析鸭子类别,把相同的放在抽象超类中实现,不同的在抽象超类中定义为抽象方法,然后不同的鸭子继承抽象超类,实现抽象方法 public abstract class Du

设计模式(15)-----策略设计模式

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 如何解决:将这些算法封装成一个一个的类,任意地替换. 关键代码:实现同一个接口. 应用实例: 1.诸葛亮的锦囊妙计,每一个锦囊就是一个策略. 2.旅行的出游方式,选择骑自行车.坐汽车,每一种旅行方式都是一个策略. 3.JAVA AWT 中的 LayoutManager. 优

【设计模式】策略设计模式

假设今天老婆让我去丈母娘家做客,可是我答应了我的情人晚上要回去陪她,这可怎么办?,,正在我纠结的时候,好哥们给我一个三个理由包,让我不要看,到时候看情况拆开 接口 三个妙计是同一个类型,继承同一个接口 /** * 声明一个接口 * @author TTF * */ public interface JieKou { public void reson(); } 三个理由类 喝酒时候的理由 public class HeJiu implements JieKou { @Override publi

【设计模式】Java设计模式第零课之策略模式

从今天开始看<<Head First 设计模式>>,打算每学习一章都写一篇笔记,今天的第零篇希望是一个好的开端,能够善始善终.加油. 设计模式入门:策略模式(看实际的需求(情景)是什么,采用适当的策略) 设计原则零:不管当初软件设计的多好,一段时间之后总是成长和改变的,否则软件就会死亡. 设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起 把会变化的部分取出并封装起来,好让其他部分不会受到影响 这样代码引起的不经意后果变少,系统变得更有弹性

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

接口的常用用法都有什么?策略设计模式复习总结

从之前的一个总结性话题引出: 从接口.抽象类到工厂模式再到JVM来总结一些问题 涉及的知识点总结如下: 策略模式概念和例子 工厂模式和策略模式比较 策略模式优缺点 策略模式的意义 使用了策略模式的API——HttpServlet类分析 解决策略膨胀问题——享元模式 StrategyPattern:策略模式也算比较简单的,同工厂模式一样都属于面向接口编程……策略模式是对象的行为模式之一,而工厂模式是对象的创建模式!它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口

Head First 设计模式之一 策略模式

策略模式 定义 策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户. 实例 上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子.假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭.绿头鸭等等,鸭子可以划水,可以呱嘎叫.在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类.如下图所示 所有鸭子都会飞.呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,

策略设计模式理解

我们开发过程中,常因为一开始的架构不怎么合理而有可能造成后边客户或者项目经理改需求时,造成我们需要修改原来的代码,一方面是可能写的时间久了回顾起来麻烦,另一方面是牵一发而动全身,改动一个地方造成所有的地方都需要改动,由此可见一个好的架构是多么重要.那么今天给大家讲一种策略设计模式来定义一个利于扩展的框架. 简单举个例子,我们开发一款游戏如果有需要定义一个角色,有武器攻击,有武器防御,那我们可能会觉得很简单,然后一开始定义就直接定义一个父类,再加一个子类实现,代码如下: abstract clas