桥接模式
当一个类的子类出现层次(或者是不同维度)关系的时候就会用到桥接模式。比如说我现在要送礼物,礼物是一个类。它的子类从送给谁这个维度来考虑有送给领导的送给女朋友的之分,同时从送什么的维度来考虑有冬虫夏草和戒指之分。这就导致了子类维度之间的混乱。这时就需要在一个子类中添加另一个子类的引用。比如说在送给女朋友的礼物这个子类中添加戒指的引用。换句话说就是把其中的一个子类当做是礼物的子类,其他的属性都当做是这个礼物的属性。说道这里好像和平常的编程没有什么两样,确实很多的设计模式在技术层面没有什么两样他们的区别只是在语义上的不同。下图展示了送给老板的冬虫夏草。
命令模式
命令模式就是同一个方法根据传入的命令不同而执行不同的动作。比如说女朋友让我做一些事情。当她发出逛街购物的命令时我就执行购物的动作。当她发出抱抱的动作的时候我就会抱住她。当然命令模式一般还用在一个操作的撤销上面在这里就不展开叙述了。下面代码就展示了上述的情景。
命令接口
package command; public abstract class Command { public abstract void execute(); public abstract void unDo(); }
购物命令
package command; public class ShoppingCommand extends Command{ @Override public void execute() { System.out.println("shopping"); } @Override public void unDo() { System.out.println("no shopping"); } }
拥抱命令
package command; public class HugCommand extends Command{ @Override public void execute() { System.out.println("hug"); } @Override public void unDo() { System.out.println("open my arms"); } }
男孩类
package command; public class Boy { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void doSomething(Command cmd) { cmd.execute(); } }
MM类
package command; import java.util.ArrayList; import java.util.List; public class MM { private String name; private List<Command> cmds = new ArrayList(); public String getName() { return name; } public void setName(String name) { this.name = name; } public void order(Boy b) { cmds.add(new ShoppingCommand());//想要更换命令时直接跟换子类就ok cmds.add(new HugCommand()); for(Command cmd : cmds) { b.doSomething(cmd); } } public static void main(String[] args) { MM mm = new MM(); mm.order(new Boy()); } }
状态模式
简单来说状态模式就是在执行同一个方法时会根据状态的不同而而不同。比如说美眉在高兴的时候的笑容就是甜甜的笑容,在难过时的笑容就是苦笑。说白了也就是高兴时一套东西难过时一套东西。这让我们想起了抽象工厂模式。下面代码展示了状态模式。
状态类
package state; public abstract class State { public abstract void smile(); public abstract void cry(); public abstract void say(); }
开心的状态
package state; public class HappyState extends State{ @Override public void smile() { System.out.println("高兴的笑"); } @Override public void cry() { System.out.println("高兴的哭"); } @Override public void say() { System.out.println("高兴的说"); } }
难过的状态
package state; public class UnHappyState extends State{ @Override public void smile() { System.out.println("难过的笑"); } @Override public void cry() { System.out.println("难过的哭"); } @Override public void say() { System.out.println("难过的说"); } }
MM类
package state; public class MM { private String name; private State state = new HappyState(); public String getName() { return name; } public void setName(String name) { this.name = name; } public void smile() { state.smile(); } public void cry() { state.cry(); } public void say() { state.say(); } public static void main(String[] args) { MM mm = new MM(); mm.cry(); } }
最后感谢(老马)马士兵老师!