简单理解设计模式之策略模式
2016-09-08 21:10
381 查看
1.首先谈谈最近的感受吧。
这些天,忙于各种笔试,,真是应了那个话,书到用时方恨少,发现自己的知识储备跟其他的人还有非常大的差距,所以在这里跟自己说一句还是学习吧,慢慢来,不用急,机会总会有的,用来共勉。好了,杂话就说到这里了,下面我们来正式进入主题,设计模式之策略模式:
学习之前我觉得有必要要先明白这些:
(1)OO(Oriented Object)原则:面向对象,封装,多态,继承;
(2)面向接口编程
(3)少用继承,多用组合(后面会说到)
在使用的时候我总是喜欢问一下,为什么要用到策略模式,不用不行吗?问题的答案是肯定的可以,我们很多人在写代码的时候,都会觉得自己写的东西都是对的,完美的,我也是这样的一个人,不知道你们是不是也是这样?因为我们在项目中肯定会用到java的编程思想,比如说面向对象,封装,继承,多态,但我们真的就理解了这一些内容了吗?我们真的很清楚的去使用了吗?反正我是没有,于是我就想怎么样才能写出更好的代码呢?于是就是翻阅资料,发现有一种东西叫做设计模式,才发现原来自己写的东西真的不堪入目,有点乱。可能大家一听到设计模式就会感到这是高大上的东西,但我要强调的就是,设计模式不是高大上的东西,它是我们无数热爱编程的人,一步步摸索而来的,或许有一天我们会有更好的也不一定。
2.首先来说说设计模式----策略模式的概念吧
策略模式的定义:定义一个算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的模式独立于使用此算法的客户。(ps:觉得不对的话可看英文原版)
是不是觉得很难理解,一开始我也是的,后面发现也不难,因为大多数人开发的时候都可能已经用到了,下面我来说说我的理解:要理解策略模式我觉得我们记住这几个字就行了,那就是:变跟不变结合。什么是组合呢?首先何为变:就是需要经常变化的类抽象成接口,然后我们把写接口的实现类。不变的是:就是一些对象普遍具有的特征,把他抽象成一个抽象类,这个就需要一点技巧了,我也很难说。组合:其实就是把实现接口的类嵌入到抽象类(基类)中,然后我们再定义一个类来继承这个抽象类(子类)。这些做完后你看看对象跟对象是不是依赖度变低了,代码的复用性也变强了?其实这就是策略模式,看到这先好好的思考一下,下面我通过一个生动的例子来谈谈(还是先通过图来):
下面是代码:
首先抽象一个Animal类
上面的就是一个简答的应用策略模式看法的一个小小的例子,是不是是曾相识?
感觉到相似就对了,好好的想一下什么是变,什么是不变,为什么要组合,我觉得就会了80%了。
有不对的地方欢迎指出来,一起进步!
这些天,忙于各种笔试,,真是应了那个话,书到用时方恨少,发现自己的知识储备跟其他的人还有非常大的差距,所以在这里跟自己说一句还是学习吧,慢慢来,不用急,机会总会有的,用来共勉。好了,杂话就说到这里了,下面我们来正式进入主题,设计模式之策略模式:
学习之前我觉得有必要要先明白这些:
(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%了。
有不对的地方欢迎指出来,一起进步!
相关文章推荐
- 简单理解常用设计模式(二)策略模式
- 设计模式: 真正理解策略模式(Strategy)
- java策略模式(strategy pattern)的简单理解
- 深入理解JavaScript系列(33):设计模式之策略模式
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
- 设计模式之策略模式:简单实现
- 设计模式 简单理解
- 设计模式——《大话设计模式》——简单工厂模式+策略模式+策略与简单工场结合
- 简单模拟Comparator-策略设计模式
- 设计模式的简单理解
- 极速理解设计模式系列:8.策略模式(Strategy Pattern)
- 大话设计模式总结(28种设计模式定义+简单理解)
- 【设计模式】简单工程模式和策略模式的区别
- 设计模式心得笔记--简单工厂和策略模式
- 极速理解设计模式系列:8.策略模式(Strategy Pattern)
- 深入理解JavaScript系列(33):设计模式之策略模式
- (一)23种设计模式的理解之我见------策略模式(Strategy Pattern)
- 设计模式简单理解
- 设计模式 学习笔记(1)简单工厂模式、策略模式
- 设计模式1(简单工厂模式,策略模式)