设计模式学习笔记2

<!-- /* 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 中的JdbcTemplateHibernateTemplate

实例代码:

// 抽象的报表

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.  命令模式

生活: 战争中为了战后分析,指挥官( 发出者) 通过电报( 命令的载体) 下达作战命令给士兵( 接受者) ,可以通过电报进行战后分析。

定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

应用:strutsAction

代码:

// 命令接受者

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();

}

// 结果

厨师收到命令做饭了

厨师收到取消做菜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值