策略模式

策略模式设计原则

a) 封装变化的概念

b) 编程中使用接口,而不是对接口的实现,面向接口编程;

 

策略模式的意义

a) 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。

b) 弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

策略模式的组成

a) 抽象策略角色:策略类,通常由一个接口或者抽象类实现

b) 具体策略角色:包装了相关的算法和行为

c) 环境角色:持有一个策略类的引用,最终给客户端调用的。

 

策略模式的编写步骤

a) 对策略对象定义一个公共接口。

b) 编写策略类,该类实现了上面的公共接口

c) 在使用策略对象的类中保存一个对策略对象的引用。

d) 在使用策略对象的类中,实现对策略对象的setget方法(注入)或者使用构造方法完成赋值

 

策略模式的缺点

a) 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

b) 造成很多的策略类。

 

解决方案:采用工厂方法。

 

package com.zp.pattern.strategy;

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

package com.zp.pattern.strategy;

public class Add implements Strategy {

	@Override
	public int caculate(int a, int b) {
		return a + b;
	}
}

package com.zp.pattern.strategy;

public class Multiple implements Strategy {

	@Override
	public int caculate(int a, int b) {
		return a * b;
	}
}

package com.zp.pattern.strategy;

public class Environment {
	//这是父类的引用,创建的对象可以将指向子类对象的引用赋给父类引用;
	private Strategy strategy;
	
	public Environment(Strategy strategy){
		this.strategy = strategy;
	}

	public Strategy getStrategy() {
		return strategy;
	}

	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
	
	//父类引用指向子类对象,这里的strategy已经指向对应子类对象;
	public int caculate(int a,int b){
		return strategy.caculate(a,b);
	}
}

package com.zp.pattern.strategy;

public class Test {
	public static void main(String[] args) {
		Strategy add = new Add();
		Environment e1 = new Environment(add);
		System.out.println(e1.caculate(3,4));
		
		Multiple multiple = new Multiple();
		Environment e2 = new Environment(multiple);
		System.out.println(e2.caculate(3,4));
	}
}

   结果:7   12

 

 注:主要应用了多态,父类引用指向子类对象,通过父类引用这一个变量,接收多个子类对象,由于父类引用已经通过构造器的初始化指向了子类对象,所以父类引用的调用相当于子类对象的调用,策略模式中既有类的封装,又有面向接口的编程 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值