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%了。
有不对的地方欢迎指出来,一起进步!