文档章节

策略模式(Strategy)

d
 danere
发布于 2016/05/11 23:40
字数 738
阅读 2
收藏 0

策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的原则
–封装变化的概念
–编程中使用接口,而不是对接口的实现

策略模式的定义
–定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
–策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

策略模式的意义
–策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。
–弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

策略模式的组成
–抽象策略角色:策略类,通常由一个接口或者抽象类实现
–具体策略角色:包装了相关的算法和行为
–环境角色:持有一个策略类的引用,最终给客户端调用的。

策略模式的实现
–策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
–策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
–环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。

策略模式的编写步骤
–1.对策略对象定义一个公共接口。(Strategy)
–2.编写策略类,该类实现了上面的公共接口。(AddStrategy,SubtractStrategy,MultiplyStrategy,DivideStrategy)
–3.在使用策略对象的类中保存一个对策略对象的引用。(Environment)
–4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。

策略模式实现加减乘除:

package Stratery;

public interface Strategy {
    public int calulate(int a,int b);
}

package Stratery;

public class AddStrategy implements Strategy{
    public int calulate (int a,int b){
        return a+b;
    }
} 

package Stratery;

public class SubtractStrategy implements Strategy {
    public int calulate(int a,int b){
        return a-b;
    }
}

package Stratery;

public class MultiplyStrategy implements Strategy {
    public int calulate (int a,int b){
        return a*b;
    }
}

package Stratery;

public class DivideStrategy implements Strategy {
    public int calulate (int a,int b){
        return a/b;
    }
}

package Stratery;

public class Environment {
    
    private Strategy strategy;
    
    public Environment(Strategy strategy) {
        // TODO 自动生成的构造函数存根
        this.strategy=strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public int calulate(int a,int b){
        return strategy.calulate(a,b);
    }
}

package Stratery;

public class Client {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        AddStrategy addStrategy = new AddStrategy();
        
        Environment environment = new Environment(addStrategy);

        System.out.println(environment.calulate(3, 4));

        SubtractStrategy subtractStrategy = new SubtractStrategy();

        environment.setStrategy(subtractStrategy);

        System.out.println(environment.calulate(3, 4));

        MultiplyStrategy multiplyStrategy = new MultiplyStrategy();

        environment.setStrategy(multiplyStrategy);

        System.out.println(environment.calulate(3, 4));

        DivideStrategy divideStrategy = new DivideStrategy();

        environment.setStrategy(divideStrategy);

        System.out.println(environment.calulate(3, 4));
    }

}

 

本文转载自:http://www.cnblogs.com/daneres/p/4479411.html

共有 人打赏支持
上一篇: Object类
d
粉丝 0
博文 51
码字总数 0
作品 0
泉州
私信 提问
Javascript策略模式理解以及应用

最近一直在看Javascript设计模式,想通过写文章来增加自己对策略模式的理解,同时记录自己学习的经历。希望大家看完之后觉得有收获可以帮忙点个赞表示支持。 策略模式的定义 策略模式的定义是...

arzh
2018/12/18
0
0
设计模式-Strategy Pattern

一、 策略(Strategy)模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化...

Start-up
2012/05/17
0
0
23种设计模式(12):策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,...

LCZ777
2014/07/09
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式之-策略模式(Strategy)

策略模式标准定义:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 策略(Strategy)模式属于对象的行为模式,通过分析Strat...

wenqi0501
2017/11/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring学习记录

Java类定义配置 @Configuration //标记为配置类@ComponentScan //标记为扫描当前包及子包所有标记为@Component的类@ComponentScan(basePackageClasses = {接口.class,...}) //标记为扫描当...

CHONGCHEN
31分钟前
1
0
如何开发一款以太坊(安卓)钱包系列2 - 导入账号及账号管理

这是如何开发一款以太坊(安卓)钱包系列第2篇,如何导入账号。有时用户可能已经有一个账号,这篇文章接来介绍下,如何实现导入用户已经存在的账号。 导入账号预备知识 从用户需求上来讲,导...

Tiny熊
今天
3
0
intellJ IDEA搭建java+selenium自动化环境(maven,selenium,testng)

1.安装jdk1.8; 2.安装intellJ; 3.安装maven; 3.1 如果是单前用户,配置用户环境变量即可,如果是多用户,则需配置系统环境变量,变量名为MAVEN_HOME,赋值D:\Application\maven,往path中...

不最醉不龟归
今天
4
0
聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
4
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部