zoukankan      html  css  js  c++  java
  • 设计模式学习笔记

    学习了马士兵老师《设计模式视频教程》和相关资料的一些感悟

    第一课:观察者模式

          优点:利用事件传递模式使类与类进行解耦,减少轮询资源消耗

          仿照Java GUI 写的一个小例子,可以很好的说清楚观察者模式

         

    package awt;
    
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Test {
       
    	public static void main(String[] args) {
    		
    		Button b = new Button();
    		b.addActionListener(new MyActionListener());
    		b.addActionListener(new MyActionListener());
    	    b.buttonPressed();
    	}
    
    }
    
    
    class Button {
    	private List<ActionListener> ActionListeners =  new ArrayList<ActionListener>();
    	public void buttonPressed(){
    		for(int i = 0;i< ActionListeners.size();i++ ){
    			ActionListener a = ActionListeners.get(i);
    			a.actionPerformed(new ActionEvent());
    		}
    	}
    	public void addActionListener(ActionListener l){
    		 ActionListeners.add(l);
    	}
    }
    
    
    interface ActionListener{
    	public void actionPerformed(ActionEvent e);
    		
    }
    
    
    class MyActionListener implements ActionListener{
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		System.out.println("ButtonPressed");
    		System.out.println(e.getWhen());
    		
    	}
    
    	
    	
    }
    
    
    class ActionEvent{
    	public long getWhen(){
    		return System.currentTimeMillis();
    	}
    	public Object getSource(){
    		return null;
    	}
    	
    }

      

    第二课:过滤器模式

          感悟:

           1.一般操作过程会抽象成一个类,类里面封装的函数就是操作的逻辑过程,这样可以利用策略模式,达到快速变换,解耦的目的

           2. 怎么解决 链条式编程,只要把与构造相关的函数返回本对象的引用

                     类似这样

               //**************  我是代码分割线   *********  

               fc.addFilter(new HTMLFilter())
              .addFilter(new SesitiveFilter());


               //...........    

              public FilterChain add(Filter filter){
                   filters.add(filter);
                   return this;
              }

              //**************  我是代码分割线   *********  

    第三课:策略模式          

           怎么判断任意数组的元素大小?可以实现Comparable接口的compareTo函数

           元素实现Comparable的CompareTo方法,缺点:这个类只能有一种比较逻辑了

           怎么解决呢?Comparator的使用,类中定义一个Comparator变量

         

           Comparable的CompareTo方法中 return new CatHeightComparator.compare(this,o);

           //**************  我是代码分割线   ********* 

           public int compareTo(Object o) {

                       return comparator.compare(this, o);

          }

           //**************  我是代码分割线   ********* 

    第四课:代理模式

          代理模式用继承实现,都调用父类的方法

          代理模式用聚合实现,都调用成员变量的方法

          聚合比继承更灵活,继承层次会无限制,

     

          代理就是实现方法添加额外操作的方式

          反射就是得到class就可以有很多api可以得知这个类的方法属性等,然后进行操作

    第五课:工厂模式

          工厂模式把产生过程封装起来,或者说控制起来,不能谁都可以随随便便new一个类,工厂类,专门生产类的类类型

    第六课:其它模式

          桥接模式:运用聚合代替继承,使用桥接模式,两个维度排列组合

          装饰模式:又称转换器,如InputStreamReader,将InputStream转换成一个Reader

          命令模式: 为了文档编辑undo功能发明,其实就是保持一个任务队列,然后可以依次执行或者依次放弃执行任务

          State模式:跟策略模式没什么区别 准备一组算法,并将每一个算法封装起来,使得它们可以互换

    以上我们简单的讨论了

         观察者模式,策略模式,动态代理,工厂模式,桥接模式,命令模式

         记住一句话,80%的模式是 IF-Else 语句 的实现

  • 相关阅读:
    基于 BP 神经网络的识别手写体数字
    【science封面文章】Human-level concept learning through probabilistic program induction
    漫谈小样本的类人概念学习与大数据的深度强化学习
    Setting up a Deep Learning Machine from Scratch (Software)
    Building Apache Thrift on CentOS 6.5¶
    ---Ubuntu 14.04下配置caffe---
    markdown基本语法说明
    Andrew ng清华报告听后感
    Median of Two Sorted Arrays
    LeetCode Question Difficulty Distribution
  • 原文地址:https://www.cnblogs.com/hzmbbbb/p/4279726.html
Copyright © 2011-2022 走看看