您的位置:首页 > 编程语言 > Java开发

Java设计模式----策略模式

2017-08-17 14:23 405 查看

策略模式(Strategy Pattern)体现了两个很主要的面向对象设计的原则



1、封装变化的概念。



2、编程中使用接口。而不是对接口的实现。



策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法。而且都有各自不同的实现。这些算法实现能够在client调用它们的时候互不影响的变化。

子算法之间是弱连接的关系,提高了软件的可扩展性与可重用性。



策略模式组成



1、抽象策略角色:策略类。通常由一个接口或者抽象类实现



2、详细策略角色:包含了相关的算法和行为,可能不止一个详细策略角色



3、环境角色:持有一个策略类的引用,终于给client调用的。



策略模式编写步骤



1、对一组算法抽象出一个共同接口,定义这个共同接口



2、编写策略类,实现这个借口,每一个策略类都有其独特的实现



3、编写环境角色类,类中持有一个对共同接口的引用,对策略对象注入如set方法和get方法或者用构造方法完毕赋值

以下是一个策略模式事例

刘备要到江东娶老婆了。走之前诸葛亮给赵云(伴郎)三个锦囊妙计。说是按天机拆开解决棘手问题,嘿,还别说,真是攻克了大问题。搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。

先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计。运行,然后获胜。用 JAVA 程序怎么表现这个呢?我们先看类图:



三个妙计是同一类型的东东。那咱就写个接口:

package com.sanguo.strategy;

/**
* 定义策略接口
* 诸葛亮妙计接口
* */
public interface IStrategy {
//每一个锦囊妙计都是一个可运行的算法
public void operate();
}


然后再写三个实现类,有三个妙计嘛:

package com.sanguo.strategy;

/**
* 走后门算法
* */
public class BackDoor implements IStrategy {

@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}

}


package com.sanguo.strategy;

/**
* 求吴国太开绿灯算法
* */
public class GivenGreenLight implements IStrategy {

@Override
public void operate() {
System.out.println("求吴国太开绿灯,放行!

");
}

}


package com.sanguo.strategy;

/**
* 孙夫人断后挡追兵
* */
public class BlockEnemy implements IStrategy {

@Override
public void operate() {
System.out.println("孙夫人断后。挡住追兵");
}

}


好了,大家看看。三个妙计是有了,那须要有个地方放这些妙计呀,放锦囊呀:

package com.sanguo.strategy;

/**
* 环境角色。主要完毕对特定策略的调用 这里代表诸葛亮装计策的锦囊
* */
public class Context {
private IStrategy strategy;

public Context(IStrategy strategy) {
this.strategy = strategy;// 构造函数,你要使用的计策算法
}

//使用计谋,看我出招
public void operate() {
this.strategy.operate();
}
}


然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说。小亮的三个妙计还真是不错,瞅瞅:

package com.sanguo.strategy;

public class ZhaoYun {
public static void main(String[] args) {
Context context;
// 刚刚到吴国的时候拆第一个
context = new Context(new BackDoor()); // 拿到妙计
context.operate(); // 拆开运行
// 刘备乐不思蜀了,拆第二个了
context = new Context(new GivenGreenLight());
context.operate(); // 运行了第二个锦囊了
// 孙权的小兵追了,咋办?拆第三个
context = new Context(new BlockEnemy());
context.operate(); // 孙夫人退兵
}
}


运行结果。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: