<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoHeader, li.MsoHeader, div.MsoHeader {mso-style-noshow:yes; mso-style-priority:99; mso-style-link:"页眉 Char"; margin:0cm; margin-bottom:.0001pt; text-align:center; mso-pagination:none; tab-stops:center 207.65pt right 415.3pt; layout-grid-mode:char; border:none; mso-border-bottom-alt:solid windowtext .75pt; padding:0cm; mso-padding-alt:0cm 0cm 1.0pt 0cm; font-size:9.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} p.MsoFooter, li.MsoFooter, div.MsoFooter {mso-style-noshow:yes; mso-style-priority:99; mso-style-link:"页脚 Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:none; tab-stops:center 207.65pt right 415.3pt; layout-grid-mode:char; font-size:9.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; text-decoration:underline; text-underline:single;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:21.0pt; mso-char-indent-count:2.0; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} span.Char {mso-style-name:"页眉 Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:页眉; mso-ansi-font-size:9.0pt; mso-bidi-font-size:9.0pt; mso-font-kerning:1.0pt;} span.Char0 {mso-style-name:"页脚 Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:页脚; mso-ansi-font-size:9.0pt; mso-bidi-font-size:9.0pt; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-fareast-font-family:宋体; mso-hansi-font-family:Calibri; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:313147411; mso-list-type:hybrid; mso-list-template-ids:-1612652258 -1485536588 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:1267733770; mso-list-type:hybrid; mso-list-template-ids:-1693524440 -1356953942 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l2 {mso-list-id:1360859309; mso-list-type:hybrid; mso-list-template-ids:-2125816898 873603762 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} @list l3 {mso-list-id:2050496937; mso-list-type:hybrid; mso-list-template-ids:1770977710 -1062543898 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l3:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l4 {mso-list-id:2111772007; mso-list-type:hybrid; mso-list-template-ids:-1996465562 1214404976 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l4:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> <![endif]-->
行为型模式:
1. 模板方法模式:
定义: 定义一个算法的执行骨架,而将具体的算法延迟带子类中实现。 应用:Spirng 中的JdbcTemplate 和HibernateTemplate 实例代码: // 抽象的报表 public abstract class Report { public void prin(){ printHeader(); printBody(); printTail (); } public void printHeader(){} public void printBody(){} public void printTail (){} } // 财务的报表 public class FinanceReport extends Report {
@Override public void printBody() { System. out .println ( " 财务的内容 " ); }
@Override public void printHeader() { System. out .println( " 财务的表头 " ); }
@Override public void printTail() { System. out .println( " 财务的表尾 " ); }
} //HR 的报表 public class HRReport extends Report {
@Override public void printBody() { System. out .println( "HR 的内容 " ); }
@Override public void printHeader() { System. out .println( "HR 的表头 " ); }
@Override public void printTail() { System. out .println( "HR 的表尾 " ); }
} // 客户端 public static void main(String[] args) { Report r = new HRReport(); r .prin();
r = new FinanceReport(); r.prin(); } // 运行结果 HR 的表头 HR 的内容 HR 的表尾 财务的表头 财务的内容 财务的表尾 |
2. 观察者模式
生活: 订阅报纸的时候当你订阅后只要有新的报纸变自动发布给你。 定义: 定义对象之间的一种一对多的依赖关系,当一个对象的状态发生该变的时候,所有依赖它的对象都得到通知并被自动更新 应用:swing 中的监听器 实例代码: // 被观察着 public interface Observable { void attach(Observer o); void detach(Observer o); void inform(); } // 被观察者的实现 public class StockObservable implements Observable {
private Vector vec = new Vector();
public void attach(Observer o) { vec .addElement(o); }
public void detach(Observer o) { vec .removeElement(o); }
private Enumeration observers(){ return ((Vector) vec .clone()).elements(); } public void inform(){ Enumeration e = this .observers(); while (e.hasMoreElements()){ ((Observer)e.nextElement()).update(); } } } // 观察者接口 public interface Observer { void update(); } // 观察者的实现 public class ObverserComputer implements Observer {
public void update() { System. out .println( " 电脑股票更新 " ); }
} public class ObverserPhone implements Observer {
public void update() { System. out .println( " 手机股票更新 " ); }
} // 客户端 public static void main(String[] args) { Observable observable = new StockObservable(); observable .attach( new ObverserComputer()); observable .attach( new ObverserPhone()); observable.inform(); } // 运行结果 电脑股票更新 手机股票更新
通过 JDK 自带的实现 // 被监听者 public class StockObservable extends Observable { public void change(){ this .setChanged(); this .notifyObservers( " 中国工商银行 " ); } } // 监听者 public class ObverserPhone implements Observer {
public void update(Observable arg0, Object arg1) { String name = (String)arg1; System. out .println(name+ " 手机股票更新 " ); } }
public class ObverserComputer implements Observer {
public void update(Observable arg0, Object arg1 ) { String name = (String)arg1 ; System. out .println(name+ " 电脑股票更新 " ); } }
// 客户端 public static void main(String[] args) { StockObservable observable = new StockObservable(); observable.addObserver ( new ObverserComputer()); observable.addObserver ( new ObverserPhone()); observable.change(); } |
3. 状态模式
定义: 根据对象的不同状态,将有不同的行为 应用:OA 中的公文流转。 实例代码: // 状态接口 public interface State { void handle(Document doc); } // 状态 public class CreatingState implements State {
public void handle(Document doc) { doc.setState( new CreateState()); System. out .println( " 公文创建完成 " ); }
} public class CreateState implements State {
public void handle(Document doc) { doc.setState( new ApprovedState ()); System. out .println( " 公文一级主管审批 " ); }
} public class ApprovedState implements State {
public void handle(Document doc) { doc.setState( new CreateState()); System. out .println( " 公文审批完成 " ); }
} // 文档 public class Document { private State state ;
public Document(){ state = new CreatingState(); } public State getState() { return state ; }
public void setState(State state) { this . state = state; }
public void handle(){ state .handle( this ); } } // 客户端 public static void main(String[] args) { Document doc = new Document(); doc .handle(); doc .handle(); doc .handle(); } // 运行结果 公文创建完成 公文一级主管审批 公文审批完成 |
4. 策略模式
生活: 商家为了促销不同商品的打折不一样。 定义:定义一系列的算法,并将每一个算法封装起来,从而使他们可以互相替换。目的是让算法独立于使用它的客户端而独立变化( 单一原则) 。 代码: // 打折 public interface StrategyDiscount { void discount(); } // 打一折 public class StrategyOne implements StrategyDiscount {
public void discount() { System. out .println( " 打一折 " ); } } // 打 2 折 public class StrategyTwo implements StrategyDiscount {
public void discount() { System. out .println( " 打 2 折 " ); } } // public class Context { private StrategyDiscount s ;
public void discount(){ s .discount(); }
public StrategyDiscount getS() { return s ; }
public void setS(StrategyDiscount s) { this . s = s; } } // 客户端 public static void main(String[] args) { Context c = new Context(); c.setS( new StrategyOne()); c.discount();
c.setS( new StrategyTwo()); c.discount(); } // 结果 打一折 打 2 折 |
5. 责任链模式
生活: 公司的投资额度不同,就相应需要不同的部门审批 定义:使多个对象有机会处理请求,避免发送者和接受者之间的耦合,形成一条链,并且沿着链传递,知道一个相应的对象处理它。 代码: // 抽象处理类 public abstract class Approver { private Approver hander ;
public abstract void approver(BorrowBill b);
public Approver getHander() { return hander ; }
public void setHander(Approver hander) { this . hander = hander; } } // 部门主管审批 public class DeptApprover extends Approver {
@Override public void approver(BorrowBill b) { if (b.getMoney()<1000d){ System. out .println( " 部门主管处理 :" +b.getName()+b.getMoney()); } else if ( super .getHander() != null ){ super .getHander().approver(b); } }
} // 经理和董事长审批类似 public class ManagerApprover extends Approver {
@Override public void approver(BorrowBill b ) { if (1000d<=b .getMoney()&&b .getMoney()<5000d){ System. out .println( " 经理处理 :" +b .getName()+b .getMoney()); } else if ( super .getHander() != null ){ super .getHander().approver(b ); } }
}
public class ChairManApprover extends Approver {
@Override public void approver(BorrowBill b) { if (5000d<=b.getMoney()){ System. out .println( " 董事长处理 :" +b.getName()+b.getMoney()); } else if ( super .getHander() != null ){ System. out .println( " 不能处理了 " ); } }
} // 申请处理的对象 public class BorrowBill { private String name ; private double money ; public double getMoney() { return money ; } public void setMoney( double money) { this . money = money; } public String getName() { return name ; } public void setName(String name) { this . name = name; }
} // 客户端 public static void main(String[] args) { Approver depart = new DeptApprover(); Approver manager = new ManagerApprover(); Approver chair = new ChairManApprover(); BorrowBill b = new BorrowBill(); b.setMoney(3000d); b.setName( " 出差借支单 " ); depart.setHander(manager); manager.setHander(chair); depart.approver(b);
b.setMoney(500d); depart.approver(b); } // 结果 经理处理 : 出差借支单 3000.0 部门主管处理 : 出差借支单 500.0 |
6. 命令模式
生活: 战争中为了战后分析,指挥官( 发出者) 通过电报( 命令的载体) 下达作战命令给士兵( 接受者) ,可以通过电报进行战后分析。 定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 应用:struts 的Action 代码: // 命令接受者 public class Chef { public void cook(){ System. out .println( " 厨师收到命令做饭了 " ); } public void stop(){ System. out .println( " 厨师收到取消做菜 " ); } } // 命令接口 public interface Command { void execute(); } // 做饭命令 public class CookCommand implements Command { private Chef c ; public CookCommand(Chef c){ this . c = c; } public void execute() { c .cook(); }
} // 取消做饭命令 public class StopCommand implements Command { private Chef c ; public StopCommand(Chef c){ this . c = c; } public void execute() { c .stop(); }
} // 命令发布者类,消费者 public class Consumer { private List list = new ArrayList(); public void addCommand (Command command){ list .add(command); }
public void orderDishes(){ Iterator iterator = list .iterator(); while (iterator.hasNext()){ Command command = (Command)iterator.next(); command.execute(); } } } // 客户点 public static void main(String[] args) { Chef c = new Chef(); Command command = new CookCommand(c); Consumer consumer = new Consumer (); consumer.addCommand(command); Command stop = new StopCommand(c); consumer.addCommand(stop); consumer.orderDishes(); } // 结果 厨师收到命令做饭了 厨师收到取消做菜 |