策略模式
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到
使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计
一个抽象类(可有可无,属于辅助类)
案例一
统一接口
/**
* Created by Wgs on 2017/9/25.
*/
public interface ICalculator {
public int calculate(String exp);
}
提供辅助类
/**
* Created by Wgs on 2017/9/25.
*/
public abstract class AbstractCalculator {
public int[] split(String exp, String opt) {
String[] array = exp.split(opt);
int[] arrayInt = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}
三个实现类
/**
* Created by Wgs on 2017/9/25.
*/
public class Plus extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String exp) {
int arrayInt[] = split(exp,"\\+");
return arrayInt[0] + arrayInt[1];
}
}
/**
* Created by Wgs on 2017/9/25.
*/
public class Multiply extends AbstractCalculator implements ICalculator {
@Override
public int calculate(String exp) {
int[] arrayInt = split(exp, "\\*");
return arrayInt[0] * arrayInt[1];
}
}
测试类
/**
* Created by Wgs on 2017/9/25.
*/
public class StrategyTest {
public static void main(String[] args) {
String exp = "2-8";
ICalculator iCalculator = new Minus();
int result = iCalculator.calculate(exp);
System.out.println(result);
}
}
策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因
此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。
案例二
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,
嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子
的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊
里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜
三个妙计是同一类型的东东,那咱就写个接口:
/**
* Created by Wgs on 2017/9/25.
*/
public interface IStrategy {
// 每一几个锦囊妙计都是一个可执行的算法
public void operate();
}
三个实现类
/**
* Created by Wgs on 2017/9/25.
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
/**
* Created by Wgs on 2017/9/25.
*/
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
妙计有了,还要有锦囊
/**
* Created by Wgs on 2017/9/25.
*/
public class Context {
private IStrategy iStrategy;
// 构造方法,你要私用那个妙计
public Context(IStrategy iStrategy) {
this.iStrategy = iStrategy;
}
// 使用妙计
public void operate() {
iStrategy.operate();
}
}
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老
爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
/**
* Created by Wgs on 2017/9/25.
*/
public class ZaoYun {
public static void main(String[] args) {
/**
* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
*/
IStrategy iStrategy = new BackDoor();
Context context = new Context(iStrategy);
context.operate();
}
}
代理模式
案例一
其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,
比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找
一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因
为律师在法律方面有专长,可以替我们进行操作
接口
/**
* Created by Wgs on 2017/9/25.
*/
public interface SourceAble {
public void method();
}
被代理类
/**
* Created by Wgs on 2017/9/25.
*/
public class Source implements SourceAble {
@Override
public void method() {
System.out.println("Source.method");
}
}
被代理类
/**
* Created by Wgs on 2017/9/25.
*/
public class Proxy implements SourceAble {
private SourceAble sourceAble;
public Proxy() {
this.sourceAble = new Source();
}
@Override
public void method() {
before();
sourceAble.method();
after();
}
private void after() {
System.out.println("Proxy.after");
}
public void before() {
System.out.println("Proxy.before");
}
}
测试类
/**
* Created by Wgs on 2017/9/25.
*/
public class ProxyTest {
public static void main(String[] args) {
SourceAble proxy = new Proxy();
proxy.method();
}
}
案例二
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
先定义一种类型的女人:
/**
* Created by Wgs on 2017/9/25.
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
public interface KindWomen {
//这种类型的女人能做什么事情呢?
public void makeEyesWithMan(); //抛媚眼
public void happyWithMan(); //happy what? You know that!
}
潘金莲
/**
* Created by Wgs on 2017/9/25.
*/
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("潘金莲破媚眼..");
}
@Override
public void happyWithMan() {
System.out.println("潘金莲在和男人做那个.....");
}
}
王婆
/**
* Created by Wgs on 2017/9/25.
*/
public class WangPo implements KindWomen {
private KindWomen kindWomen;
public WangPo() {
this.kindWomen = new PanJinLian();
}
// 她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
//王婆这么大年龄了,谁看她抛媚眼?!
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
// 自己老了,干不了,可以让年轻的代替
this.kindWomen.happyWithMan();
}
}
西门庆
/**
* Created by Wgs on 2017/9/25.
*/
public class XiMenQing {
/*
* 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
* 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
* 收了不少好处费,那我们假设一下:
* 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
*/
public static void main(String[] args) {
//把王婆叫出来
KindWomen kindWomen = new WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏
kindWomen.makeEyesWithMan();
kindWomen.happyWithMan();
}
}