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

来源:互联网 发布:群发短信软件 免费 编辑:程序博客网 时间:2024/05/20 11:24

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 {@Overridepublic void eatBanana() {System.out.println("吃香蕉");}@Overridepublic void girlsFriend() {System.out.println("会撩妹");}@Overridepublic void sing() {System.out.println("会唱儿歌");}@Overridepublic void study() {System.out.println("会学习");}@Overridepublic 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
原创粉丝点击