最近工作都很浮躁,也没怎么看书和学习,觉得这样不好,最近慢慢梳理一下学习的东西,温故知新,废话不多说,下面我们开始讲第一个设计模式——策略模式
记得head first设计模式有这样一句话,策略模式就是一种组合的方案,将接口和抽象类组合在一起从而解决代码不灵活和代码重复的问题,“有一个比是一个好”
这样来说,我们都学过面向对象设计,万物皆对象(当然不是指女票),一个对象有很多属性,比如说人,有名字,身高,体重,年龄等属性,这些都是这个对象的状态,当然人有很多行为,比如跑,吃,说话等,我们在设计一个对象的时候就要尽量将对象的属性和行为分开,属性放到抽象类里面,这样容易扩展属性,比如机器人,他也是抽象人的一种,它拥有各种零件,螺丝属性来那个,这些人没有的,我们抽取公共的属性放到抽象类,就像实现可扩展,行为放到接口里面,因为这些行为不只是人专有的,动物也有,只是方式不同,比如人是两只脚跑步,动物是四只脚,有的机器人是两个轮子跑,具体怎么跑,我们实现同一个接口,而将接口作为抽象类的一个属性,就可以动态的改变行为的方式,我们看看下面的代码
首先我创建一个人类的抽象类:
public abstract class Man {
private String name;
private Say say;
public Man(String name, Say say) {
this.name = name;
this.say = say;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Say getSay() {
return say;
}
public void setSay(Say say) {
this.say = say;
}
public abstract void show();
public void say(){
say.saySomeThing();
}
}
其中Say是一个接口,就是讲话的方式
public interface Say {
void saySomeThing();
}
然后Say有两个实现
public class Speak implements Say{
@Override
public void saySomeThing() {
System.out.println("i am a man, i can speak");
}
}
public class NoSound implements Say {
@Override
public void saySomeThing() {
System.out.println("I'm a doll, i cant't speak");
}
}
这两种实现就是具体讲话的两种策略,所以策略模式比较适用于策略比较固定的情况
然后我们实现一个具体的人
public class People extends Man{
public People(String name, Say say) {
super(name, say);
}
@Override
public void show() {
System.out.println("I'm a man");
}
}
这样一个活生生的人就出现了
现在我们让这个人说话
public static void main(String[] args) {
Say say = new Speak();
People people = new Man("张山",say);
people.say();
people.setSay(new NoSound());
people.say();
}
我们多了一个set策略的方法,就可以动态去改变策略了,运行结果如下
i am a man, i can speak
I'm a doll, i cant't speak
总而言之,策略是对同一种行为不同实现的封装,在各大框架上面都有采用,比如对不同数据库的连接,日志框架中的slfj