zoukankan      html  css  js  c++  java
  • [java笔记]常用的设计模式

    1.单例设计模式

      单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

      1)构造方法私有化

      2)声明一个本类对象

      3)给外部提供一个静态方法获取对象实例

      例如:

        class Singleton{

          private static Singletho1 s = new Singletho1();

          private Singletho1(){}

          public static Singletho1 getInstance(){

            return s;

          }

        } 

    2.模板方法模式(Templete Method)

      模板方法模式:定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中。模板方法模式使得子类可以不改变

             一个算法的结构即可重新定义该算法的某些特定的步骤。

    3.策略模式(Strategy Pattern)

      策略模式:定义了一系列的算法,将每一种算法封装起来并可以互相替换使用,策略模式让算法独立于使用它的客户应用而独立变化

      OO设计原则:

        1)面向接口编程(面向抽象编程)

        2)封装变化(把可变化的东西抽象出来,单独封装起来)

        3)多用组合,少用继承

        4)对修改关闭,对扩展开放

    4.简单工厂模式

      简单工厂模式:由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式。

      例如:

        

     1 public class FactoryDemo {
     2     
     3     public static void main(String[] args) {
     4         
     5         Doll clothDoll = DollFactory.getInstance("cloth");
     6         if(clothDoll != null){
     7             System.out.println(clothDoll.getInfo());
     8         }
     9         Doll barbieDoll = DollFactory.getInstance("barbie");
    10         if(barbieDoll != null){
    11             System.out.println(barbieDoll.getInfo());
    12         }
    13         
    14     }
    15     
    16 }
    17 
    18 
    19 /**
    20  * @ClassName: DollFactory 
    21  * @Description: 工厂类 
    22  * @date 2015年1月16日 上午11:03:18 
    23  */
    24 class DollFactory{
    25      //值负责产生对象
    26     public static Doll getInstance (String name){
    27         //根据条件不同的对象
    28         if("cloth".equals(name)){
    29             return new ClothDoll();
    30         }else if ("barbie".equals(name)){
    31             return new BarbieDoll();
    32         }
    33         return null;
    34     }
    35     
    36 }
    37 
    38 /**
    39  * @ClassName: Doll 
    40  * @Description: 娃娃类 
    41  * @date 2015年1月16日 上午11:03:13 
    42  */
    43 interface Doll{
    44     
    45     public String getInfo();
    46 }
    47 
    48 /**
    49  * @ClassName: ClothDoll 
    50  * @Description:  布娃娃
    51  * @date 2015年1月16日 上午11:03:09 
    52  */
    53 class ClothDoll implements Doll{
    54     
    55     public String getInfo(){
    56         return "我是布娃娃。";
    57     }
    58 }
    59 
    60 
    61 /**
    62  * @ClassName: BarbieDoll 
    63  * @Description: 芭比娃娃 
    64  * @date 2015年1月16日 上午11:03:03 
    65  */
    66 class BarbieDoll implements Doll{
    67     
    68     public String getInfo(){
    69         return "我是芭比娃娃.";
    70     }
    71 }
    FactoryDemo Code

     5.代理设计模式

      代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式说白了就是“真实对象”的代表,在

      访问对象时引入一定程度的间接性,因为这种间接性可以附件多种用途。

      静态代理:

     1 /**
     2  * @Title: ProxyDemo.java 
     3  * @Package proxydemo 
     4  * @Description: TODO 
     5  * @date 2015年1月16日 下午7:33:00 
     6  * @version V1.0  
     7  */
     8 package proxydemo;
     9 
    10 /**
    11  * @ClassName: ProxyDemo 
    12  * @Description:  代理模式:为其他对象提供一种代理以控制对这个对象的访问。
    13  * @date 2015年1月16日 下午7:33:00 
    14  */
    15 public class ProxyDemo {
    16 
    17     /**
    18      * @Title: main 
    19      * @Description: TODO 
    20      * @param args     
    21      * @return void     
    22      */
    23     public static void main(String[] args) {
    24 
    25         Person p = new Person("小白");
    26         //创建代理对象,并把代理对象传进来
    27         Matchmaker m = new Matchmaker(p);
    28         
    29         m.miai();//相亲
    30     }
    31 
    32 }
    33 
    34 
    35 /**
    36  * @ClassName: Subject 
    37  * @Description: 主题接口 
    38  * @date 2015年1月16日 下午7:37:46 
    39  */
    40 interface Subject{
    41     
    42     public void miai();
    43     
    44 }
    45 
    46 
    47 /**
    48  * @ClassName: Person 
    49  * @Description: 被代理类 
    50  * @date 2015年1月16日 下午7:37:25 
    51  */
    52 class Person implements Subject{
    53 
    54     private String name;
    55     
    56     public Person(String name){
    57         this.name = name;
    58     }
    59     
    60     public void miai(){
    61         System.out.println(name+"正在相亲中。。。");
    62     }
    63     
    64 }
    65 
    66 
    67 /**
    68  * @ClassName: Matchamker 
    69  * @Description: 代理类 
    70  * @date 2015年1月16日 下午7:36:58 
    71  */
    72 class Matchmaker implements Subject{
    73     
    74     private Subject target;//要代理的目标对象
    75     
    76     public Matchmaker(Subject target){
    77         this.target = target;
    78     }
    79     
    80     //相亲之前要做的事情
    81     private void before(){
    82         System.out.println("为代理人匹配如意郎君。");
    83     }
    84     
    85     //相亲之后要做的事情
    86     private void after(){
    87         System.out.println("本次相亲结束。");
    88     }
    89     
    90     //相亲方法
    91     public void miai(){
    92         before();
    93         //真正执行相亲方法
    94         target.miai();
    95         after();
    96     }
    97 }
    ProxyDemo Code

       动态代理:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以再运行期(Runtime)实现动态关联。

      

      

      1 /**
      2  * @Title: Subject.java 
      3  * @Package dynaproxy 
      4  * @Description: TODO 
      5  * @date 2015年2月23日 下午8:37:49 
      6  * @version V1.0  
      7  */
      8 package dynaproxy;
      9 
     10 /**
     11  * @ClassName: Subject 
     12  * @Description: 要代理的主题接口 
     13  * @date 2015年2月23日 下午8:37:49 
     14  */
     15 public interface Subject {
     16 
     17     /**
     18      * @Title: miai 
     19      * @Description: 相亲      
     20      * @return void     
     21      */
     22     public void miai();
     23     
     24 }
     25 
     26 
     27 /**
     28  * @Title: Person.java 
     29  * @Package dynaproxy 
     30  * @Description: TODO 
     31  * @date 2015年2月23日 下午8:39:12 
     32  * @version V1.0  
     33  */
     34 package dynaproxy;
     35 
     36 /**
     37  * @ClassName: Person 
     38  * @Description: TODO 
     39  * @date 2015年2月23日 下午8:39:12 
     40  */
     41 public class Person implements Subject{
     42 
     43     private String name;
     44     
     45     public Person(String name){
     46         this.name = name;
     47     }
     48 
     49     /* (non-Javadoc)
     50      * <p>Title: miai</p> 
     51      * <p>Description: </p>  
     52      * @see dynaproxy.Subject#miai()
     53      */
     54     @Override
     55     public void miai() {
     56         
     57         System.out.println(name+"正在相亲中。。");
     58         
     59     }
     60     
     61 }
     62 
     63 /**
     64  * @Title: DynaProxy.java 
     65  * @Package dynaproxy 
     66  * @Description: TODO 
     67  * @date 2015年2月23日 下午8:40:47 
     68  * @version V1.0  
     69  */
     70 package dynaproxy;
     71 
     72 import java.lang.reflect.InvocationHandler;
     73 import java.lang.reflect.Method;
     74 
     75 /**
     76  * @ClassName: DynaProxy 
     77  * @Description: 动态代理类 
     78  * @date 2015年2月23日 下午8:40:47 
     79  */
     80 public class DynaProxy implements InvocationHandler{
     81 
     82     private Object target;
     83     public DynaProxy(Object target){
     84         this.target = target;
     85     }
     86     
     87     
     88     /* (non-Javadoc)
     89      * <p>Title: invoke</p> 
     90      * <p>Description: </p> 
     91      * @param proxy
     92      * @param method
     93      * @param args
     94      * @return
     95      * @throws Throwable 
     96      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     97      */
     98     @Override
     99     public Object invoke(Object proxy, Method method, Object[] args)
    100             throws Throwable {
    101         Object obj = null;
    102         before();
    103         //正真调用业务方法
    104         obj = method.invoke(target, args);
    105         after();
    106         return obj;
    107     }
    108 
    109 
    110     /**
    111      * @Title: after
    112      * @Description: 相亲之后要做的事情
    113      * @return void
    114      */
    115 
    116     private void after() {
    117         System.out.println("本次相亲结束。");
    118     }
    119 
    120     /**
    121      * @Title: before
    122      * @Description: 相亲之前要做的事情
    123      * @return void
    124      */
    125 
    126     private void before() {
    127         System.out.println("为代理人匹配如意郎君。");
    128     }
    129         
    130 
    131 }
    132 
    133 /**
    134  * @Title: Test.java 
    135  * @Package dynaproxy 
    136  * @Description: TODO 
    137  * @date 2015年2月23日 下午8:49:10 
    138  * @version V1.0  
    139  */
    140 package dynaproxy;
    141 
    142 import java.lang.reflect.Proxy;
    143 
    144 /**
    145  * @ClassName: Test 
    146  * @Description: TODO 
    147  * @date 2015年2月23日 下午8:49:10 
    148  */
    149 public class Test {
    150 
    151     public static void main(String[] args) {
    152         
    153         Person p = new Person("小白");
    154         DynaProxy dp = new DynaProxy(p);
    155         
    156         /*
    157          * Proxy提供用于创建动态代理类和实例的静态方法,
    158          * 它还是这些方法创建的所有动态代理类的超类。
    159          */
    160         //动态生成代理对象(类加载器,被代理接口,InvocationHandler)
    161         Subject s = (Subject) Proxy.newProxyInstance(p.getClass()
    162                 .getClassLoader(), p.getClass().getInterfaces(), dp);
    163         s.miai();
    164     }
    165     
    166 }
    View Code

    6.适配器模式

      适配器模式(Adapter):将一个类的接口装换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一

      起工作的那些类可以一起工作。

      例如:

      1 /**
      2  * @Title: AdapterDemo.java 
      3  * @Package adapterdemo 
      4  * @Description: TODO 
      5  * @date 2015年1月16日 下午8:03:11 
      6  * @version V1.0  
      7  */
      8 package adapterdemo;
      9 
     10 /**
     11  * @ClassName: AdapterDemo 
     12  * @Description: 适配器模式(Adapter):将一个类的接口装换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 
     13  * @date 2015年1月16日 下午8:03:11 
     14  */
     15 public class AdapterDemo {
     16 
     17     /**
     18      * @Title: main 
     19      * @Description: TODO 
     20      * @param args     
     21      * @return void     
     22      */
     23     public static void main(String[] args) {
     24 
     25         PowerA powerA = new PowerAImpl();
     26         start(powerA);
     27         
     28         PowerB powerB = new PowerBImpl();
     29         //把powerB封装进适配器
     30         PowerAAdapter pa = new PowerAAdapter(powerB);
     31         start(pa);
     32     
     33     }
     34 
     35     //开始工作
     36     public static void start(PowerA powerA){
     37         powerA.insert();
     38     }
     39     
     40 }
     41 
     42 
     43 /**
     44  * @ClassName: PowerAAdapter 
     45  * @Description: 适配器类 
     46  * @date 2015年1月16日 下午8:31:59 
     47  */
     48 class PowerAAdapter implements PowerA{
     49     
     50     private PowerB powerB;//要进行适配的接口
     51     
     52     public PowerAAdapter(PowerB powerB){
     53         this.powerB = powerB;
     54     }
     55     
     56     public void insert(){
     57         powerB.connect();
     58     }
     59     
     60 }
     61 
     62 
     63 /**
     64  * @ClassName: PowerA 
     65  * @Description: 电源A接口 
     66  * @date 2015年1月16日 下午8:05:11 
     67  */
     68 interface PowerA{
     69     
     70     public void insert();
     71     
     72 }
     73 
     74 
     75 /**
     76  * @ClassName: PowerAImpl 
     77  * @Description: TODO 
     78  * @date 2015年1月16日 下午8:07:33 
     79  */
     80 class PowerAImpl implements PowerA{
     81     
     82     public void insert(){
     83         System.out.println("电源A接口插入,开始工作。");
     84     }
     85     
     86 }
     87 
     88 
     89 /**
     90  * @ClassName: PowerB 
     91  * @Description: 电源B接口 
     92  * @date 2015年1月16日 下午8:05:54 
     93  */
     94 interface PowerB{
     95     
     96     public void connect();
     97     
     98 }
     99 
    100 /**
    101  * @ClassName: PowerBImpl 
    102  * @Description: TODO 
    103  * @date 2015年1月16日 下午8:08:49 
    104  */
    105 class PowerBImpl implements PowerB{
    106     
    107     public void connect(){
    108         System.out.println("电源B接口以连接,开始工作。");
    109     }
    110     
    111 }
    AdapterDemo Code

    7.享元设计模式

      享元设计模式(Flyweight Pattern):它使用共享对象,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似对象;

      它适合用于当大量对象只是重复因而导致无法令人接受的使用大量内存。通常对象中的部分状态是可以分享的。常见做法是把

      他们放在外部数据结构,当需要使用时再将他们传递给享元。

      运用共享技术有效的支持大量细粒度的对象。

      例如:Integrate在一个字节内的对象。

    8.装饰者设计模式

      装饰着设计模式(Decorator):动态地给对象添加一些额外的职责。就添加功能来说,Decorator模式相比生成子类更为灵活。

      改模式以对客户透明的方式扩展对象的功能。

      涉及角色:

        1)抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。

        2)具体构件角色:将要被附加功能的类,实现抽象构件角色接口。

        3)抽象装饰者角色:将有对具体构件角色的引用并定义与抽象构件角色一致的接口。

        4)具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能。

      示例代码:

      1 package decoratorDemo;
      2 
      3 /**
      4  * @ClassName: Drink 
      5  * @Description: 被装饰者对象接口
      6  * @date 2015年2月5日 下午9:23:33 
      7  */
      8 public interface Drink {
      9 
     10     //饮料的描述
     11     public String description();
     12     
     13     //计算价格
     14     public float cost();
     15         
     16 }
     17 
     18 
     19 package decoratorDemo;
     20 
     21 /**
     22  * @ClassName: SoyaBeanMilk 
     23  * @Description: 具体的被装饰者对象: 豆浆
     24  * @date 2015年2月5日 下午9:26:13 
     25  */
     26 public class SoyaBeanMilk implements Drink{
     27 
     28     /* (non-Javadoc)
     29      * <p>Title: decription</p> 
     30      * <p>Description: </p> 
     31      * @return 
     32      * @see decoratorDemo.Drink#decription()
     33      */
     34     @Override
     35     public String description() {        
     36         return "纯豆浆";
     37     }
     38 
     39     /* (non-Javadoc)
     40      * <p>Title: cost</p> 
     41      * <p>Description: </p> 
     42      * @return 
     43      * @see decoratorDemo.Drink#cost()
     44      */
     45     @Override
     46     public float cost() {
     47         return 5f;
     48     }
     49 
     50 }
     51 
     52 
     53 package decoratorDemo;
     54 
     55 /**
     56  * @ClassName: Decorator 
     57  * @Description: 装饰者基类 
     58  * @date 2015年2月5日 下午9:29:37 
     59  */
     60 public abstract class Decorator implements Drink{
     61 
     62     private Drink drink;//要装饰的对象
     63     
     64     public Decorator(Drink drink){
     65         this.drink = drink;
     66     }
     67     
     68     /* (non-Javadoc)
     69      * <p>Title: decription</p> 
     70      * <p>Description: </p> 
     71      * @return 
     72      * @see decoratorDemo.Drink#decription()
     73      */
     74     @Override
     75     public String description() {        
     76         return drink.description();
     77     }
     78 
     79     /* (non-Javadoc)
     80      * <p>Title: cost</p> 
     81      * <p>Description: </p> 
     82      * @return 
     83      * @see decoratorDemo.Drink#cost()
     84      */
     85     @Override
     86     public float cost() {        
     87         return drink.cost();
     88     }
     89 
     90 }
     91 
     92 
     93 package decoratorDemo;
     94 
     95 /**
     96  * @ClassName: SugarDecorator 
     97  * @Description: 具体的装饰者对象:糖 
     98  * @date 2015年2月5日 下午9:35:35 
     99  */
    100 public class SugarDecorator extends Decorator{
    101 
    102     /**
    103      * @Title: SugarDecorator 
    104      * @Description: TODO 
    105      * @param drink    
    106      */
    107     public SugarDecorator(Drink drink) {
    108         super(drink);        
    109     }
    110 
    111     public String description(){
    112         return super.description()+"+糖";
    113     }
    114     
    115     public float cost(){
    116         return super.cost()+0.5f;
    117     }
    118     
    119 }
    120 
    121 
    122 package decoratorDemo;
    123 
    124 
    125 /**
    126  * @ClassName: BlackBeanDecorator 
    127  * @Description: 具体的装饰者对象:黑豆 
    128  * @date 2015年2月5日 下午9:39:34 
    129  */
    130 public class BlackBeanDecorator extends Decorator{
    131 
    132     /**
    133      * @Title: BlackBeanDecorator 
    134      * @Description: TODO 
    135      * @param drink    
    136      */
    137     public BlackBeanDecorator(Drink drink) {
    138         super(drink);
    139     }
    140     
    141     public String description(){
    142         return super.description()+"+黑豆";
    143     }
    144     
    145     public float cost(){
    146         return super.cost()+3.0f;
    147     }
    148 
    149 }
    150 
    151 
    152 package decoratorDemo;
    153 
    154 /**
    155  * @ClassName: EggDecorator 
    156  * @Description: 具体装饰者对象:鸡蛋 
    157  * @date 2015年2月5日 下午9:44:01 
    158  */
    159 public class EggDecorator extends Decorator{
    160 
    161     /**
    162      * @Title: EggDecorator 
    163      * @Description: TODO 
    164      * @param drink    
    165      */
    166     public EggDecorator(Drink drink) {
    167         super(drink);
    168     }
    169 
    170     public String description(){
    171         return super.description()+"+鸡蛋";
    172     }
    173     
    174     public float cost(){
    175         return super.cost()+2.0f;
    176     }
    177     
    178     
    179 }
    180 
    181 
    182 package decoratorDemo;
    183 
    184 /**
    185  * @ClassName: Test 
    186  * @Description: 测试 
    187  * @date 2015年2月5日 下午9:46:59 
    188  */
    189 public class Test {
    190 
    191     /**
    192      * @Title: main 
    193      * @Description: TODO 
    194      * @param args     
    195      * @return void     
    196      */
    197     public static void main(String[] args) {
    198 
    199         //生产一杯豆浆
    200         Drink soya = new SoyaBeanMilk();
    201         //在豆浆中加鸡蛋
    202         EggDecorator eggSoya = new EggDecorator(soya);
    203         //在加了鸡蛋的豆浆中加糖
    204         SugarDecorator sugarEggSoya = new SugarDecorator(eggSoya);
    205         //在加了糖的豆浆中加黑豆
    206         BlackBeanDecorator blackBeanSugarEggSoya = new BlackBeanDecorator(sugarEggSoya);
    207         
    208         //结账
    209         System.out.println("你点的是:"+blackBeanSugarEggSoya.description());
    210         System.out.println("一共:"+blackBeanSugarEggSoya.cost()+"元");
    211     }
    212 
    213 }
    装饰者模式

    9.观察者模式

      观察者模式定义:简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象观察一个主题对象。

      这样一个主题对象在状态上的变化能够通过所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

      

      Subject( 被观察的对象接口)

        -规定ConcreteSubject的统一接口;

        -每个Subject可以有多个Observer;

      ConcreteSubject(具体被观察对象)

        -维护对所有具体观察者的引用的列表;

        -状态变化时会发送通知给所有注册的观察者。

      Observer(观察者接口)

        -规定ConcreteObserver的统一接口;

        -定义了一个update()方法;

      ConcreteObserver(具体观察者)

        -维护一个对ConcreteSubject的引用;

        -特定状态与ConcreteSubject同步;

        -实现Observer接口,通过update()方法接收ConcreteSubject的通知。

      

      示例代码:

      1 /**
      2  * @Title: Subject.java 
      3  * @Package observer 
      4  * @Description: TODO 
      5  * @date 2015年2月23日 上午10:09:19 
      6  * @version V1.0  
      7  */
      8 package observer;
      9 
     10 /**
     11  * @ClassName: Subject 
     12  * @Description: 被观察者接口 
     13  * @date 2015年2月23日 上午10:09:19 
     14  */
     15 public interface Subject {
     16 
     17     /**
     18      * @Title: registerObserver 
     19      * @Description: 注册为一个观察者 
     20      * @param o     
     21      * @return void     
     22      */
     23     public void registerObserver(Observer o);
     24     
     25     /**
     26      * @Title: removeObserver 
     27      * @Description: 取消观察者 
     28      * @param o     
     29      * @return void     
     30      */
     31     public void removeObserver(Observer o);
     32     
     33     /**
     34      * @Title: notifyObserver 
     35      * @Description: 通知所有观察者更新信息      
     36      * @return void     
     37      */
     38     public void notifyObservers();
     39     
     40 }
     41 
     42 /**
     43  * @Title: Observer.java 
     44  * @Package observer 
     45  * @Description: TODO 
     46  * @date 2015年2月23日 上午10:13:40 
     47  * @version V1.0  
     48  */
     49 package observer;
     50 
     51 /**
     52  * @ClassName: Observer 
     53  * @Description: TODO 
     54  * @date 2015年2月23日 上午10:13:40 
     55  */
     56 public interface Observer {
     57 
     58     /**
     59      * @Title: update 
     60      * @Description: 观察者更新信息方法 
     61      * @param price     
     62      * @return void     
     63      */
     64     public void update(float price);
     65     
     66 }
     67 
     68 /**
     69  * @Title: Doll.java 
     70  * @Package observer 
     71  * @Description: TODO 
     72  * @date 2015年2月23日 上午10:17:18 
     73  * @version V1.0  
     74  */
     75 package observer;
     76 
     77 import java.util.Vector;
     78 
     79 /**
     80  * @ClassName: Doll 
     81  * @Description: 具体的被观察者对象:娃娃 
     82  * @date 2015年2月23日 上午10:17:18 
     83  */
     84 public class Doll implements Subject {
     85 
     86     
     87     /**
     88      * @Fields v : 被观察者维护的一个观察者对象列表
     89      */
     90     private Vector<Observer> v = new Vector<Observer>();
     91     
     92     /**
     93      * @Fields price : 价格
     94      */
     95     private float price;
     96     
     97     public float getPrice(){
     98         return price;
     99     }
    100     
    101     /**
    102      * @Title: setPrice 
    103      * @Description: 修改价格时,通知所有观察者 
    104      * @param price     
    105      * @return void     
    106      */
    107     public void setPrice(float price){
    108         this.price = price;
    109         notifyObservers();
    110     }
    111     
    112     /**
    113      * @Title: Doll 
    114      * @Description: TODO 
    115      * @param price    
    116      */
    117     public Doll(float price) {
    118         super();
    119         this.price = price;
    120     }
    121 
    122     /**
    123      * @Title: Doll 
    124      * @Description: TODO     
    125      */
    126     public Doll() {
    127         super();
    128     }
    129 
    130     /* (non-Javadoc)
    131      * <p>Title: registerObserver</p> 
    132      * <p>Description: </p> 
    133      * @param o 
    134      * @see observer.Subject#registerObserver(observer.Observer)
    135      */
    136     @Override
    137     public void registerObserver(Observer o) {
    138         //注册观察者
    139         v.add(o);
    140         
    141     }
    142 
    143     /* (non-Javadoc)
    144      * <p>Title: removeObserver</p> 
    145      * <p>Description: </p> 
    146      * @param o 
    147      * @see observer.Subject#removeObserver(observer.Observer)
    148      */
    149     @Override
    150     public void removeObserver(Observer o) {
    151         //取消观察者
    152         v.remove(o);
    153         
    154     }
    155 
    156     /* (non-Javadoc)
    157      * <p>Title: notifyObserver</p> 
    158      * <p>Description: </p>  
    159      * @see observer.Subject#notifyObserver()
    160      */
    161     @Override
    162     public void notifyObservers() {
    163         //实现通知所有的观察者对象
    164         for (Observer o:v){
    165             o.update(price);
    166         }
    167         
    168     }
    169 
    170 }
    171 
    172 /**
    173  * @Title: Person.java 
    174  * @Package observer 
    175  * @Description: TODO 
    176  * @date 2015年2月23日 上午10:29:39 
    177  * @version V1.0  
    178  */
    179 package observer;
    180 
    181 /**
    182  * @ClassName: Person 
    183  * @Description: 具体的观察者对象 
    184  * @author 欧其平
    185  * @date 2015年2月23日 上午10:29:39 
    186  */
    187 public class Person implements Observer{
    188 
    189     private String name;
    190     
    191     public  Person(String name){
    192         this.name = name;
    193     }
    194     
    195     /* (non-Javadoc)
    196      * <p>Title: update</p> 
    197      * <p>Description: </p> 
    198      * @param price 
    199      * @see observer.Observer#update(float)
    200      */
    201     @Override
    202     public void update(float price) {
    203 
    204         System.out.println(name+"关注的娃娃的价格已更新为:"+price);
    205         
    206     }
    207 
    208 }
    209 
    210 /**
    211  * @Title: Main.java 
    212  * @Package observer 
    213  * @Description: TODO 
    214  * @date 2015年2月23日 上午10:35:19 
    215  * @version V1.0  
    216  */
    217 package observer;
    218 
    219 /**
    220  * @ClassName: Main 
    221  * @Description: TODO 
    222  * @date 2015年2月23日 上午10:35:19 
    223  */
    224 public class Main {
    225 
    226     /**
    227      * @Title: main 
    228      * @Description: TODO 
    229      * @param args     
    230      * @return void     
    231      */
    232     public static void main(String[] args) {
    233         
    234         //创建一个被观察者对象
    235         Doll doll = new Doll(3000);        
    236         Person p1 = new Person("小白");
    237         Person p2 = new Person("小黑");        
    238         //注册成为一个观察者
    239         doll.registerObserver(p1);
    240         doll.registerObserver(p2);
    241         System.out.println("第一次降价:");
    242         //价格变动
    243         doll.setPrice(2698);
    244         System.out.println("第二次降价:");
    245         //价格变动
    246         doll.setPrice(2299);
    247         System.out.println("第三次降价:");
    248         //价格变动
    249         doll.setPrice(1998);
    250         
    251         doll.removeObserver(p2);
    252         System.out.println("第四次降价:");
    253         //价格变动
    254         doll.setPrice(1098);
    255     }
    256 
    257 }
    View Code

      

      

  • 相关阅读:
    Github
    Vocabulary in Computer
    js中三种定义变量的方式const, var, let的区别
    Node.js-1
    JSON_in_js
    JSON快速入门
    Mysql tinyint长度为1时在java中被转化成boolean型
    maven上解决循环依赖、又不想新加第三模块的方法
    关于springboot和tomcat的服务能力做下简单的测试
    tomcat各个端口的作用
  • 原文地址:https://www.cnblogs.com/julyme/p/4225579.html
Copyright © 2011-2022 走看看