Java设计模式三
2017-01-05 14:31
106 查看
本文内容来自慕课网系列课程,记录下学习的内容。
有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节
首先定义一个发型接口
然后定义两个实现
然后创建一个工厂类
这样就可以通过
这样做还有确定,假设还有别的发型,则在
根据类的名称来创建对象
1.JDBC
2.spring beanfactory
在责任链模式中,作为请求接受者的多个对象通过对其后继的引用而连接起来形成一条链,请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接受者都可以选择自行处理请求或是向后继传递请求。
这里以销售为例
首先创建一个抽象类
创建如下类:
创建一个
在
Java设计模式三
工厂模式
什么情况下适合工厂模式?有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式应用
本例子的内容是,创建发型首先定义一个发型接口
HairInterface
/* * 发型接口 */ public interface HairInterface { public void draw(); }
然后定义两个实现
HairInterface接口的类,
LeftHair和
RightHair
public class LeftHair implements HairInterface { @Override public void draw() { System.out.println("左偏分发型"); } }
然后创建一个工厂类
HairFactory
/* * 发型工厂 */ public class HairFactory { /** * 根据类型来创建对象 * @param key * @return */ public HairInterface getHair(String key) { if ("left".equals(key)) { return new LeftHair(); }else if("right".equals(key)){ return new RightHair(); } return null; } }
这样就可以通过
HairFactory的
getHair方法来创建发型了
这样做还有确定,假设还有别的发型,则在
getHair方法中还要进行多个判断。
根据类的名称来创建对象
/** * 根据类的名称来创建对象 * @return */ public HairInterface getHairByClass(String className) { try { HairInterface hair = (HairInterface) Class.forName(className).newInstance(); return hair; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }
抽象工厂模式
常见应用:1.JDBC
2.spring beanfactory
责任链模式
责任链模式在责任链模式中,作为请求接受者的多个对象通过对其后继的引用而连接起来形成一条链,请求在这条链上传递,直到链上某一个接收者处理这个请求。每个接受者都可以选择自行处理请求或是向后继传递请求。
这里以销售为例
首先创建一个抽象类
PriceHandler,价格处理人,负责处理客户折扣请求
/* * 价格处理人,负责处理客户折扣请求 */ public abstract class PriceHandler { /** * 直接后继,用于传递请求 */ protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /* * 处理折扣申请 */ public abstract void processDiscount(float discount); }
创建如下类:
Sales销售人员,可以批准5%以内的折扣
Manager销售经理,可以批准30%以内的折扣
Director销售总监,可以批准40%以内的折扣
CEO,可以批准55%以内的折扣
Sales类如下,其它基本类似:
/* * 销售人员,可以批准5%以内的折扣 */ public class Sales extends PriceHandler{ @Override public void processDiscount(float discount) { if (discount <= 0.05) { System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount); }else{ successor.processDiscount(discount); } } }
CEO类如下:
/* * CEO,可以批准55%以内的折扣 */ public class CEO extends PriceHandler { @Override public void processDiscount(float discount) { if (discount <= 0.55) { System.out.format("%s批准了折扣:%.2f", this.getClass().getName(), discount); }else{ System.out.format("%s拒绝了折扣:%.2f", this.getClass().getName(), discount); } } }
创建一个
Customer类,请求折扣
/* * 客户类,请求折扣 */ public class Customer { private PriceHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler) { this.priceHandler = priceHandler; } public void requestDiscount(float discount) { priceHandler.processDiscount(discount); } public static void main(String[] args) { Customer customer = new Customer(); customer.setPriceHandler(PriceHandler.createPriceHandler()); customer.requestDiscount(0.96f); } }
在
PriceHandler中添加一个工程方法
public static PriceHandler createPriceHandler() { PriceHandler sales = new Sales(); PriceHandler manager = new Manager(); PriceHandler director = new Director(); PriceHandler ceo = new CEO(); sales.setSuccessor(manager); manager.setSuccessor(director); director.setSuccessor(ceo); return sales; }
相关文章推荐
- 用Java实现的设计模式系列(3)--Builder
- Java设计模式
- 在Java中应用设计模式 - Factory Method
- java设计模式之创建模式--singleton
- 深入浅出基于Java的解释器设计模式
- 用Java实现的设计模式系列(1)-Factory
- 深入浅出基于Java的代理设计模式
- Java设计模式专辑
- Java设计模式使用率爬行榜
- Java的建造设计模式
- 追MM与设计模式(java的32种设计模式)
- Java设计模式之Factory
- Java设计模式之Factory
- Java设计模式使用率爬行榜
- [收藏]追MM与JAVA设计模式
- Java设计模式之工厂模式篇
- 追MM与Java的23种设计模式
- 从Java类库看设计模式
- 追MM与Java的23种设计模式
- 在Java中应用设计模式 - Factory Method