####简单工厂(不属于设计模式)
简单工厂又称为静态工厂,因为其中的方法都是静态的。
简单工厂是用来创建对象实例的,包括接口,抽象类,具体类的对象实例。
package simplefactory.example1; public interface Api { public void operation(String s); }
package simplefactory.example1; public class ImplA implements Api { @Override public void operation(String s) { System.out.println("ImplA s ="+s); } }
package simplefactory.example1; public class ImplB implements Api { @Override public void operation(String s) { System.out.println("ImplB s ="+s); } }
package simplefactory.example1; public class Factory { private Factory() {} public static Api createApi(int condition){ Api api = null; if (condition == 1) { api = new ImplA(); } else if(condition == 2) { api = new ImplB(); } return api; } }
package simplefactory.example1; /** * 参数的选择来自客户端 * @author Administrator * */ public class Client { public static void main(String[] args) { Api api = Factory.createApi(1); api.operation("mfs"); } }
(一)####外观模式
package facade.example2; public class Presentation { public void generate(){ ConfigModel cm = ConfigManager.getInstance().getConfigData(); if(cm.isNeedGenPresentation()){ System.out.println("正在生成表现层代码"); } } }
package facade.example2; public class Business { public void generate(){ ConfigModel cm = ConfigManager.getInstance().getConfigData(); if(cm.isNeedGenBusiness()){ System.out.println("正在生成业务层代码"); } } }
package facade.example2; public class Dao { public void generate(){ ConfigModel cm = ConfigManager.getInstance().getConfigData(); if(cm.isNeedGenDao()){ System.out.println("正在生成数据层代码"); } } }
package facade.example2; public class ConfigManager { private ConfigManager(){} private static ConfigManager manager = null; private static ConfigModel cm = null; public static ConfigManager getInstance(){ if(manager == null){ manager = new ConfigManager(); cm = new ConfigModel(); } return manager; } public ConfigModel getConfigData(){ return cm; } }
package facade.example2; public class ConfigModel { // 是否需要生成表现层 private boolean needGenPresentation = true; // 是否需要生成逻辑层 private boolean needGenBusiness = true; // 是否需要生成Dao层 private boolean needGenDao = true; public boolean isNeedGenPresentation() { return needGenPresentation; } public void setNeedGenPresentation(boolean needGenPresentation) { this.needGenPresentation = needGenPresentation; } public boolean isNeedGenBusiness() { return needGenBusiness; } public void setNeedGenBusiness(boolean needGenBusiness) { this.needGenBusiness = needGenBusiness; } public boolean isNeedGenDao() { return needGenDao; } public void setNeedGenDao(boolean needGenDao) { this.needGenDao = needGenDao; } }
package facade.example2; public class Client { /** * 客户端使用起来非常方便 * @param args */ public static void main(String[] args) { new Facade().generate(); } }
(二)####适配器模式
package adapter.example1; /** * 已经存在的接口 * @author Administrator * */ public class Adaptee { public void specificRequest(){ System.out.println("适配器方法"); } }
package adapter.example1; /** * 客户端希望调用的接口 * @author Administrator * */ public interface Target { public void request(); }
package adapter.example1; /** * 适配器 * @author Administrator * */ public class Adapter implements Target { //被适配的对象 private Adaptee adaptee; //通过构造方法传入 public Adapter(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void request() { // TODO Auto-generated method stub adaptee.specificRequest(); } }
package adapter.example1; public class Client { public static void main(String[] args) { Adapter adapter = new Adapter(new Adaptee()); adapter.request(); } }
(三)####单例模式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return instance; } }
最简单的实现单例的例子 ,采用单元素枚举
public enum Singleton { // 一个元素就代表这个类的一个实例 uniqueIntance ; public void singletonOperate(){ } public static void main(String[] args) { for(int i=0;i<3;i++){ System.out.println(Singleton.uniqueIntance.hashCode()); } } }
利用缓存实现一个类只有三个实例
public class OneExtend { //做为key的前缀 private static final String DEFAULT_KEY = "Cache"; private OneExtend() {} private static Map<String ,OneExtend > map = new HashMap<String ,OneExtend>(); //当前正在使用的第几个实例 private static int num = 1; //最大的数量 private static final int NUM_MAX = 3; public synchronized static OneExtend getInstance(){ String key = DEFAULT_KEY+num; OneExtend object = map.get(key); if(object == null){ object = new OneExtend(); map.put(key, object); } num++; if(num > NUM_MAX){ num =1; } return object; } }
(四)####职责链模式
/** * * @author Administrator * 职责对象的接口 */ public abstract class Handler { protected Handler successor = null; public void setSuccessor(Handler successor ) { this.successor = successor; } public abstract String handleFeeRequest(String user , int fee); }
public class ProjectManager extends Handler { @Override public String handleFeeRequest(String user, int fee) { String str = ""; if(fee < 500) { if("小李".equals(user)) { str = "项目经理同意"+user + "的聚餐费用"+fee + "元的申请"; }else { str = "项目经理不同意"+user + "的聚餐费用"+fee + "元的申请"; } }else { // 超过500 , 传递给级别高的人处理 if(successor != null) { str = successor.handleFeeRequest(user, fee); } } return str; } }
public class DepManager extends Handler { @Override public String handleFeeRequest(String user, int fee) { String str = ""; if(fee < 1000) { if("小李".equals(user)) { str = "部门经理同意"+user + "的聚餐费用"+fee + "元的申请"; }else { str = "部门经理不同意"+user + "的聚餐费用"+fee + "元的申请"; } }else { // 超过1000, 传递给级别高的人处理 if(successor != null) { str = successor.handleFeeRequest(user, fee); } } return str; } }
public class GeneralManager extends Handler { @Override public String handleFeeRequest(String user, int fee) { String str = ""; if(fee >= 1000) { if("小李".equals(user)) { str = "总经理同意"+user + "的聚餐费用"+fee + "元的申请"; }else { str = "总经理不同意"+user + "的聚餐费用"+fee + "元的申请"; } }else { // 传递给级别高的人处理 if(successor != null) { str = successor.handleFeeRequest(user, fee); } } return str; } }
public class Client { public static void main(String[] args) { Handler h1 = new ProjectManager(); Handler h2 = new DepManager(); Handler h3 = new GeneralManager(); h1.setSuccessor(h2); h2.setSuccessor(h3); String res = h1.handleFeeRequest("小李", 1800); System.out.println(res); } }
(五)####装饰者模式
//组件接口 public abstract class Component { //计算某人在某段时间的奖金,为了简化,begin和end不使用 public abstract double calcPrice(String user , Date begin , Date end); }
//被装饰器装饰的对象 public class ConcreteComponent extends Component{ @Override public double calcPrice(String user, Date begin, Date end) { //默认没有奖金 return 0; } }
public abstract class Decorator extends Component { private Component component; public Decorator(Component component) { this.component = component; } @Override public double calcPrice(String user, Date begin, Date end) { return component.calcPrice(user, begin, end); } }
//计算当月奖金 public class MonthPrizeDecorator extends Decorator { public MonthPrizeDecorator(Component component) { super(component); } @Override public double calcPrice(String user, Date begin, Date end) { //前面计算的奖金 double money = super.calcPrice(user, begin, end); //取出当月奖金 double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03; System.out.println(user + "当月业务奖金" + prize); return money + prize; } }
public class SumPrizeDecorator extends Decorator { public SumPrizeDecorator(Component component) { super(component); } @Override public double calcPrice(String user, Date begin, Date end) { //前面计算的奖金 double money = super.calcPrice(user, begin, end); //累计业务额奖金 double prize =10000.0 * 0.01; System.out.println(user + "累计业务奖金" + prize); return money + prize; } }
public class GroupPrizeDecorator extends Decorator{ public GroupPrizeDecorator(Component component) { super(component); } @Override public double calcPrice(String user, Date begin, Date end) { //前面计算的奖金 double money = super.calcPrice(user, begin, end); double group = 0; for(double d : TempDB.mapMonthSaleMoney.values()) { group += d; } double prize = group * 0.01; System.out.println(user + "当月团队奖金" + prize); return money + prize; } }
public class TempDB { private TempDB() {} //记录每个人的月度销售额 public static Map<String , Double> mapMonthSaleMoney = new HashMap<>(); static { mapMonthSaleMoney.put("张三", 10000.0); mapMonthSaleMoney.put("李四", 20000.0); mapMonthSaleMoney.put("王五", 30000.0); } }
public class Client { public static void main(String[] args) { //被装饰的对象 Component c1 = new ConcreteComponent(); //组合装饰者,装饰者没有先后顺序 Decorator d1 = new MonthPrizeDecorator(c1); Decorator d2 = new SumPrizeDecorator(d1); double zs = d2.calcPrice("张三", null, null); System.out.println("张三应得奖金 :"+zs); System.out.println(); //如果是经理 Decorator d3 = new GroupPrizeDecorator(d2); double ls = d3.calcPrice("李四", null, null); System.out.println("经理李四应得奖金 :"+ls); } }
(六)####桥接模式
//实现部分的接口 public interface MessageImplementor { public void send(String message, String toUser); }
//Email 实现 public class MessageEmail implements MessageImplementor{ @Override public void send(String message, String toUser) { System.out.println("使用Email的方式发送 , "+ message + ",给" + toUser); } }
//SMS实现 public class MessageSMS implements MessageImplementor { @Override public void send(String message, String toUser) { System.out.println("使用站内SMS的方式发送 , "+ message + ",给" + toUser); } }
//抽象部分的接口 public abstract class AbstractMessage { protected MessageImplementor implementor; public AbstractMessage(MessageImplementor implementor) { this.implementor = implementor; } public void sendMessage(String message ,String toUser) { implementor.send(message, toUser); } }
//抽象部分的实现--普通消息 public class CommonMessage extends AbstractMessage { public CommonMessage(MessageImplementor implementor) { super(implementor); } @Override public void sendMessage(String message, String toUser) { // TODO Auto-generated method stub super.sendMessage(message, toUser); } }
//抽象部分的实现---加急消息 public class UrgencyMessage extends AbstractMessage { public UrgencyMessage(MessageImplementor implementor) { super(implementor); } @Override public void sendMessage(String message, String toUser) { message = "【加急】"+message; super.sendMessage(message, toUser); } }
public class Client { public static void main(String[] args) { //具体的实现 MessageImplementor impl = new MessageSMS(); //创建普通消息 AbstractMessage a = new CommonMessage(impl); a.sendMessage("请喝一杯茶", "小李"); //创建一个加急消息 a = new UrgencyMessage(impl); a.sendMessage("请喝一杯茶", "小李"); } }