简单理解设计模式之策略模式

1.首先谈谈最近的感受吧。

        这些天,忙于各种笔试,,真是应了那个话,书到用时方恨少,发现自己的知识储备跟其他的人还有非常大的差距,所以在这里跟自己说一句还是学习吧,慢慢来,不用急,机会总会有的,用来共勉。好了,杂话就说到这里了,下面我们来正式进入主题,设计模式之策略模式:

学习之前我觉得有必要要先明白这些:

(1)OO(Oriented Object)原则:面向对象,封装,多态,继承;

(2)面向接口编程

(3)少用继承,多用组合(后面会说到)

        在使用的时候我总是喜欢问一下,为什么要用到策略模式,不用不行吗?问题的答案是肯定的可以,我们很多人在写代码的时候,都会觉得自己写的东西都是对的,完美的,我也是这样的一个人,不知道你们是不是也是这样?因为我们在项目中肯定会用到java的编程思想,比如说面向对象,封装,继承,多态,但我们真的就理解了这一些内容了吗?我们真的很清楚的去使用了吗?反正我是没有,于是我就想怎么样才能写出更好的代码呢?于是就是翻阅资料,发现有一种东西叫做设计模式,才发现原来自己写的东西真的不堪入目,有点乱。可能大家一听到设计模式就会感到这是高大上的东西,但我要强调的就是,设计模式不是高大上的东西,它是我们无数热爱编程的人,一步步摸索而来的,或许有一天我们会有更好的也不一定。

2.首先来说说设计模式----策略模式的概念吧

策略模式的定义:定义一个算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的模式独立于使用此算法的客户。(ps:觉得不对的话可看英文原版)

是不是觉得很难理解,一开始我也是的,后面发现也不难,因为大多数人开发的时候都可能已经用到了,下面我来说说我的理解:要理解策略模式我觉得我们记住这几个字就行了,那就是:变跟不变结合。什么是组合呢?首先何为变:就是需要经常变化的类抽象成接口,然后我们把写接口的实现类。不变的是:就是一些对象普遍具有的特征,把他抽象成一个抽象类,这个就需要一点技巧了,我也很难说。组合:其实就是把实现接口的类嵌入到抽象类(基类)中,然后我们再定义一个类来继承这个抽象类(子类)。这些做完后你看看对象跟对象是不是依赖度变低了,代码的复用性也变强了?其实这就是策略模式,看到这先好好的思考一下,下面我通过一个生动的例子来谈谈(还是先通过图来):

下面是代码:

首先抽象一个Animal类

package com.zqu.yqy.scdn.test.test001;

public abstract class Animal {
	public void eat(){}
	public void drink(){}
	public void la(){}
	public void sa(){}
}
然后是继承类monkey和person

package com.zqu.yqy.scdn.test.test001;

public class Monkey extends Animal {
	Behaviour mb;
	public Monkey(){
		this.mb = new BehaviourImpl();
	}
	public void eat(){
		System.out.println("吃");
	}
	public void drink(){
		System.out.println("和");
	}
	public void la(){
		System.out.println("拉");
	}
	public void sa(){
		System.out.println("撒");
	}
	public void monkey1Behaviour(){
		System.out.print("猕猴");
		mb.eatBanana();
	}
	public void monkey2Behaviour(){
		System.out.print("金丝猴");
		mb.girlsFriend();
	}
	public void monkey3Behaviour(){
		System.out.print("长臂猿");
		mb.sing();
	}
//	public void monkeyDaSheng(){
//		
//	}
}
package com.zqu.yqy.scdn.test.test001;

public class Person extends Animal {
	Behaviour mb;
	public Person(){
		this.mb = new BehaviourImpl();
	}
	public void eat(){
		System.out.println("吃");
	}
	public void drink(){
		System.out.println("和");
	}
	public void la(){
		System.out.println("拉");
	}
	public void sa(){
		System.out.println("撒");
	}
	public void personBehaviour(){
		mb.girlsFriend();
		mb.sing();
		mb.eatBanana();
		mb.createThings();
		mb.study();
	}
}
接下来是行为接口:

package com.zqu.yqy.scdn.test.test001;

public interface Behaviour {
	void eatBanana();
	void girlsFriend();
	void sing();
	void study();
	void createThings();
	//如果有其他的就添加,比如举例的齐天大圣,或者可以再写一个接口等等
//	void showBehaviour();
//	void fight();
//	void fly();
}
接口实现类:

package com.zqu.yqy.scdn.test.test001;

public class BehaviourImpl implements Behaviour {

	@Override
	public void eatBanana() {
		System.out.println("吃香蕉");

	}

	@Override
	public void girlsFriend() {
		System.out.println("会撩妹");
	}

	@Override
	public void sing() {
		System.out.println("会唱儿歌");

	}

	@Override
	public void study() {
		System.out.println("会学习");
		
	}

	@Override
	public void createThings() {
		System.out.println("会创造东西");
		
	}

}
运行程序的mian:
package com.zqu.yqy.scdn.test.test001;

public class main {

	public static void main(String[] args) {
		Monkey m = new Monkey();
		Person p = new Person();
		System.out.println("人具有的基本行为:");
		System.out.println("------------");
		p.eat();
		p.drink();
		p.la();
		p.sa();
		System.out.println("------------");
		System.out.println("其他的行为:");
		System.out.println("------------");
		p.personBehaviour();
		System.out.println("------------");
		System.out.println("猴子具有的基本行为:");
		System.out.println("------------");
		m.eat();
		m.drink();
		m.la();
		m.sa();
		System.out.println("------------");
		System.out.println("不同猴子有不同的行为");
		System.out.println("------------");
		m.monkey1Behaviour();
		m.monkey2Behaviour();
		m.monkey3Behaviour();
		System.out.println("------------");
	}

}
结果截图:





上面的就是一个简答的应用策略模式看法的一个小小的例子,是不是是曾相识?

感觉到相似就对了,好好的想一下什么是变,什么是不变,为什么要组合,我觉得就会了80%了。

有不对的地方欢迎指出来,一起进步!


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值