策略设计模式理解

我们开发过程中,常因为一开始的架构不怎么合理而有可能造成后边客户或者项目经理改需求时,造成我们需要修改原来的代码,一方面是可能写的时间久了回顾起来麻烦,另一方面是牵一发而动全身,改动一个地方造成所有的地方都需要改动,由此可见一个好的架构是多么重要。那么今天给大家讲一种策略设计模式来定义一个利于扩展的框架。

简单举个例子,我们开发一款游戏如果有需要定义一个角色,有武器攻击,有武器防御,那我们可能会觉得很简单,然后一开始定义就直接定义一个父类,再加一个子类实现,代码如下:

abstract class Role {

protected String name;

protected abstract void attack();

protected abstract void defend();

}

子类实现如下:

class RoleA extends Role {

public RoleA(String name) {

this.name = name;

}

protected void attack() {

System.out.println("多兰剑");

}

protected void defend() {

System.out.println("多兰盾");

}

}

那么这个时候项目经理告诉你改需求了,又新创建了一个角色法师他也有攻击也有防御,这个时候你又得重新创建一个类

class RoleB extends Role {

public RoleB(String name) {

this.name = name;

}

protected void attack() {

System.out.println("多兰戒");

}

protected void defend() {

System.out.println("多兰盾");

}

}

这个时候你会发现代码重用的效果根本就没有达到,而且如果我人物角色又添加了其他的攻击方式,或者有多个武器装备的时候,就得改源代码了,那么今天我们先解决这个代码重用且利于扩展的问题,这里就引出我们的策略设计模式了,至于多个攻击方式,我们后边给大家介绍装饰者设计模式再说。那么重新定义该怎么定义呢,首先,我们把这些可变的攻击方式抽取出来,单独形成一个接口:

//攻击的接口

interface Attackable{

void attack();

}

//防御的接口

interface Denfenseable{

void denfense();

}

其次,攻击方式我们单独实现攻击接口,防御方式单独实现防御接口

class 多兰剑 implements Attackable{

public void attack() {

System.out.println("多兰剑攻击犀利");

}

}

class 多兰盾 implements Denfenseable{

public void denfense() {

System.out.println("防御我在行");

}

}

class 多兰戒 implements Attackable{

public void attack() {

System.out.println("多兰戒法强高");

}

}

那么我们在抽象一个共同的父类出来,定义一些每个角色共有的一些属性

abstract class Role{

public String name;

Attackable a;            //将接口的引用封装到Role中,利用多态来更利于变化

Denfenseable d;

public Role(){}

public void setAttackable(Attackable a){

this.a = a;

}

public void setDenfenseable(Denfenseable d){

this.d = d;

}

protected void attack() {

a.attack();

}

protected void defend() {

d.denfense();

}

}

这个时候我们需要角色A,比如剑圣的话,就可以直接创建剑圣来实现Role类

class RoleA extends Role{

public RoleA(String name){

this.name = name;

}

}

真正调用过程中直接

RoleA a = new RoleA ("剑圣");

a.setAttackable(new 多兰剑());

a.setDenfenseable(new 多兰盾());

a.attack();

a.defend();

这样即重用了代码,又降低了耦合。一举多得。

那么总结起来的话:

策略模式:建立行为族,将不同的行为分别封装,同时彼此可相互替代,算法的变化可以独立于使用者。
优点:提高了可复用性,将行为和使用者解耦出来

应用场景:

1、多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(具体实现可任意变化或扩充)

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

时间: 2025-01-15 04:05:37

策略设计模式理解的相关文章

设计模式之策略设计模式

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

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

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

Java编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口.为取得此效果,需要在新类中嵌入一个现有类的private对象.但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public.如果成员对象自身都隐藏了具体实现,那么这种做法是安全的.当用户能够了

应用策略设计模式

设计模式:设计模式(Design pattern)是一套被重复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了可重用代码.让代码更easy被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的.设计模式使代码编制真正project化.设计模式是软件project的基石脉络.如同大厦的结构一样. 在最開始学习设计模式时.看着书籍,总是认为设计模式非常easy.但是.每次在实战的时候.常常渴望可以用上设计模式,但总是无法第一时间应用上某种设计模式. 明

JAVA学习笔记--策略设计模式与适配器模式

一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而"策略"包含变化的部分.策略就是传递进去的参数对象,它包含要执行的代码. 这种设计模式将算法分别独立封装起来,然后将其当做参数传递给方法从而让方法产生不同的行为,不同的算法可以进行替换(就像给方法不同的实参).我们可以知道,在策略设计模式中有三个部分:策略.策略引用.接收策略引用的方法(这是笔者自己根据理解给出的名词,并没有查询有没有这些术语).下面通

Strategy策略设计模式

1.策略模式和状态模式的区别和联系(本部分转载自:http://letscoding.cn/java%E4%B8%AD%EF%BC%8C%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%8C%BA%E5%88%AB/) 策略模式通过封装一组相关算法,为Client提供运行时的灵活性.Client可以在运行时,选择任一算法,而不改变使用算法的Context.一些

策略设计模式的应用

设计模式:设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 在最开始学习设计模式时,看着书籍,总是觉得设计模式很简单.可是,每次在实战的时候,经常渴望能够用上设计模式,但总是无法第一时间应用上某种设计模式.明明自己已经知晓了多个设计模式,看书

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

策略设计模式的定义: 策略设计模式是把每一个算法封装到具有共同接口的独立类中,具体算法之间可以相互替换或者变化,这种变化不会影响客户端. 关键词:[算法封装] [共同接口] [自由替换] 策略设计模式的代码: 1 public interface IStrategy { //共同接口 2 public void doSomething(); 3 } 4 class ConcreteStrategyA implements IStrategy { //具体策略A(算法) 5 public void

设计模式理解(二)创建型——单例、原型

设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局唯一的实例的引用.碰到并发之类就呵呵了. 这么简单都能画个UML图,还煞有介事似的,我晕. -----------------------   分割线   ------------------------ 原型(Prototype) 我理解就是给一个类糊弄个cloneable之类的接口,让它自己决定