简单理解设计模式之策略模式
来源:互联网 发布:群发短信软件 免费 编辑:程序博客网 时间: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%了。
有不对的地方欢迎指出来,一起进步!
- 简单理解设计模式之策略模式
- 设计模式之策略模式理解
- 设计模式之策略模式理解
- 理解js设计模式之策略模式
- 理解设计模式之策略模式
- 设计模式之策略模式:简单实现
- 设计模式之简单工厂模式,工厂模式,策略模式
- 设计模式理解-策略模式
- 设计模式学习之简单工厂模式和策略模式
- 设计模式之简单模式与策略模式
- 设计模式之简单工厂模式和策略模式总结
- 设计模式之策略模式&简单工厂模式
- 浅谈设计模式之简单工厂模式与策略模式
- java设计模式之策略模式和简单工厂模式
- 设计模式之观察者模式简单理解
- 简单理解设计模式之外观模式
- 简单理解设计模式之工厂模式
- 简单理解设计模式之观察者模式
- 16.6 模板特化
- oracle TOP-N 与分页查询
- 第二周项目三 汉诺塔
- mysql空闲等待时间导致的问题的解决方案
- 慕课网视频下载教程
- 简单理解设计模式之策略模式
- KMP算法
- web前端学习之路
- Java 原码、反码、补码,自定义的异常类,手动抛出异常。
- python 标准化
- laravel 极验(Geetest) 让验证更安全。
- maven 学习之路一
- CodeForces-483C Diverse Permutation(构造)
- mysql更新判断存在更新,不存在插入