先大致介绍下设计模式,总共有 23 种设计模式。
这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。当然,我们还会讨论另一类设计模式:J2EE 设计模式。
近日学习了几个常见的设计模式,比如策略模式
策略模式(Strategy):策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合
优点:
1.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为.继承有助于析取出这些算法中的公共功能[DP]
2.简化了单元测试,因为每个算法都有自己的类,可以通过接口单独测试[DPE]
3.当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择和是的行为.将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句[DP]
策略模式结构图:
学习的时候发现这些概念太过抽象而且不易于记忆,就写了两个实例,实例如下:
实例一:
场景:赵云跟随刘备去东吴求亲,诸葛亮交与他三个锦囊,最后让孙权赔了夫人又折兵
首先创建了一个公共接口,创建operate方法
public interface IStrategy { void operate(); }
然后创建三个子类(也就是三个锦囊)去实现公共接口:
三个子类都实现了公共接口也继承了operate方法
public class FirstMethod implements IStrategy { @Override public void operate() { System.out.println("找乔国老帮忙,让吴国太给孙权"); } } public class SecondMethod implements IStrategy { @Override public void operate() { System.out.println("求吴国太开个绿灯"); } } public class ThirdMethod implements IStrategy { @Override public void operate() { System.out.println("孙夫人断后"); } }
然后创建一个Context类,锦囊妙计要放在锦囊里面
public class Context { IStrategy iStrategy; //构造函数,要你使用哪个策略 public Context(IStrategy strategy){ this.iStrategy = strategy; } public void operate(){ this.iStrategy.operate(); } }
最后就是客户端赵云携带锦囊遇到不同场合打开不同锦囊:
public class ZhaoYun { public static void main(String[] args){ Context context; System.out.println("----------刚到吴国拆开第一个------------"); context = new Context(new FirstMethod()); context.operate();//拆开执行 System.out.println("************************************"); System.out.println("----------刚到吴国拆开第二个------------"); context = new Context(new SecondMethod()); context.operate(); System.out.println("************************************"); System.out.println("----------刚到吴国拆开第三个------------"); context = new Context(new ThirdMethod()); context.operate(); System.out.println("************************************"); } }
运行结果:
实例二:
场景:有以下角色:国王(King)、皇后(Queen)、骑士(Knight)、妖怪(Troll),这些角色可以在游戏中每一次使用一个武器(Weapon)来攻击对方,并且可以在运行时切换武器
先创建一个使用武器的公告接口
public interface WeaponBehavior { void useWeaPon(); }
然后创建各个武器的类来实现公共接口
public class KnifeBehavior implements WeaponBehavior { @Override public void useWeaPon() { System.out.println("我使用宝剑"); } } public class AxeBehavior implements WeaponBehavior { @Override public void useWeaPon() { System.out.println("我使用斧头"); } } public class BowAndArrowBehavior implements WeaponBehavior { @Override public void useWeaPon() { System.out.println("我使用弓箭"); } } public class SwordBehavior implements WeaponBehavior { @Override public void useWeaPon() { System.out.println("我使用匕首"); } }
接着创建一个角色的抽象类和一个抽象方法display
public abstract class Role { WeaponBehavior weaponBehavior; //构造器 public Role(){ } public void setWeaponBehavior(WeaponBehavior weaponBehavior){ this.weaponBehavior = weaponBehavior; } abstract void display(); public void weaponWay(){ weaponBehavior.useWeaPon(); } }
接下来就是创建各个角色的子类继承角色类并实现抽象方法
public class King extends Role { public King(){ weaponBehavior = new AxeBehavior(); } @Override void display() { System.out.println("我是国王"); } } public class Queen extends Role { public Queen(){ weaponBehavior = new KnifeBehavior(); } @Override void display() { System.out.println("我是皇后"); } } public class Knight extends Role{ public Knight(){ weaponBehavior = new SwordBehavior(); } @Override void display() { System.out.println("我是骑士"); } } public class Troll extends Role { public Troll(){ weaponBehavior = new SwordBehavior(); } @Override void display() { System.out.println("我是妖怪"); } }
最后创建一个测试类
public class Test { public static void main(String[] args){ King king = new King(); king.display(); king.weaponWay(); System.out.println("更换武器"); king.setWeaponBehavior(new SwordBehavior()); king.weaponWay(); System.out.println("--------------------"); Queen queen = new Queen(); queen.display(); queen.weaponWay(); System.out.println("更换武器"); queen.setWeaponBehavior(new AxeBehavior()); queen.weaponWay(); System.out.println("--------------------"); Knight knight = new Knight(); knight.display(); knight.weaponWay(); System.out.println("更换武器"); knight.setWeaponBehavior(new BowAndArrowBehavior()); knight.weaponWay(); System.out.println("--------------------"); Troll troll = new Troll(); troll.display(); troll.weaponWay(); System.out.println("更换武器"); troll.setWeaponBehavior(new KnifeBehavior()); troll.weaponWay(); System.out.println("--------------------"); } }
运行的结果是: