暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

23种设计模式详解(四)

Java大联盟 2018-05-14
257


Java大联盟

致力于最高效的Java学习

 



1.装饰模式(Decorator Pattern)


顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

举例:穿上漂亮的衣服美美的化个妆谁还不是小仙女咋地。

接口:


public interface beBeautiful {
   public void beautiful();
}

 

华服:


public class hotDresses implements beBeautiful {
   @Override
   public void beautiful() {
       System.out.println("穿上漂亮的衣服");
   }
}

 

美妆:


public class Cosmetic implements beBeautiful {
   private beBeautiful beautiful;

   public Cosmetic(beBeautiful beautiful) {
       this.beautiful = beautiful;
   }

   @Override
   public void beautiful() {
       System.out.println("画一个美美的妆");
       beautiful.beautiful();
       System.out.println("谁还不是小仙女咋地");

   }
}

 

秒变小仙女:


public class You {
   public static void main(String[] args){
       beBeautiful be=new hotDresses();
       beBeautiful tt=new Cosmetic(be);
       tt.beautiful();
   }
}


结果:

 

 

 

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删)


2.迭代器模式(Iterator Pattern)


迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。

举例:模拟一个集合类的过程。

迭代器接口:


public interface Iterator {
   //前遍历
   public Object previous();
   //后遍历
   public Object next();
   //判断是否有下一个
   public boolean hasNext();
   //取第一个元素
   public Object first();
}


集合接口:


public interface Collection {
   public Iterator iterator();
   //获取集合所有元素
   public Object get(int i);
   //获取集合大小
   public int size();
}

 

迭代器实现类:


public class myIterator implements Iterator {
   private Collection collection;
   private int num=-1;

   public myIterator(Collection collection) {
       this.collection = collection;
   }

   @Override
   public Object previous() {
       if(num>0){
           num--;
       }
       return collection.get(num);
   }

   @Override
   public Object next() {
       if(num<collection.size()-1){
           num++;
       }
       return collection.get(num);
   }

   @Override
   public boolean hasNext() {
       if(num<collection.size()-1){
           return true;
       }else{
           return false;
       }
   }

   @Override
   public Object first() {
       num=0;
       return collection.get(num);
   }
}

 

集合实现类:


public class myColllection implements Collection {
   public String string[]={"1","2","3","4","5"};
   @Override
   public Iterator iterator() {
       return new myIterator(this);
   }

   @Override
   public Object get(int i) {
       return string[i];
   }

   @Override
   public int size() {
       return string.length;
   }
}

 

测试:


public class Test {
   public static void main(String[] args){
       Collection c=new myColllection();
       Iterator i=c.iterator();
       while (i.hasNext()){
           System.out.println(i.next());
       }
   }
}

 

结果:



Java.util.Iterable接口只有一个方法就是iterator(),也就是说通过这个方法可以遍历聚集类中的所有方法和属性,基本上所有高级的语言都有Iterator这个接口或者实现,Java已经把迭代器给我们准备了,我们再去写迭代器就有点儿多此一举,所以迭代器模式我们基本不用自己去实现,直接使用List或者Map就可以完整的解决问题。但是我们也必须清楚他的实现过程,这样我们就可以写出自己的集合类,甚至框架!


3.组合模式(Composite Pattern)


组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便。


public class TreeNode{
   private String name;
   private TreeNode parent;
   private Vector<TreeNode> children=new Vector<TreeNode>();
   public TreeNode(String name){
       this.name=name;
   }

   public TreeNode getParent() {
       return parent;
   }

   public void setParent(TreeNode parent) {
       this.parent = parent;
   }

   public String getName() {

       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   //添加孩子节点  
   public void add(TreeNode node){
       children.add(node);
   }
   //删除孩子节点
   public void remove(TreeNode node){
       children.remove(node);
   }
   //取得孩子节点
   public Enumeration<TreeNode> etChildren(){
       return children.elements();
   }
}


实现:


 


public class Tree {
   TreeNode root=null;

   public Tree(String name) {
       root = new TreeNode(name);
   }
   public static void main(String[] args){
       Tree tree=new Tree("A");
       TreeNode nodeB=new TreeNode("B");
       TreeNode nodeC=new TreeNode("C");
       TreeNode nodeD=new TreeNode("D");
       TreeNode nodeE=new TreeNode("E");
       TreeNode nodeF=new TreeNode("#");
       TreeNode nodeG=new TreeNode("#");
       TreeNode nodeH=new TreeNode("#");
       TreeNode nodeI=new TreeNode("#");
       TreeNode nodeJ=new TreeNode("#");
       TreeNode nodeK=new TreeNode("#");
       nodeD.add(nodeF);
       nodeD.add(nodeG);
       nodeE.add(nodeH);
       nodeE.add(nodeI);
       nodeB.add(nodeD);
       nodeB.add(nodeJ);
       nodeC.add(nodeE);
       nodeC.add(nodeK);
       tree.root.add(nodeB);
       tree.root.add(nodeC);

   }
}


使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树等。

 

4.观察者模式(Observer Pattern)


当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

 

观察者接口:


public interface Observer {
   public void update();
}


第一个观察者:


public class myObserver1 implements Observer{
   @Override
   public void update() {
       System.out.println("myObserver1 has changed");
   }
}


第二个观察者:


public class myObserver2 implements Observer {
   @Override
   public void update() {
       System.out.println("myObserver2 has changed");
   }
}


对象接口:


public interface Subject {
   //增加观察者
   public void add(Observer observer);
   //删除观察者
   public void delete(Observer observer);
   //通知所有观察者
   public void notifyObservers();
   //自己的方法
   public void operation();
}

 

需要监控的对象列表:


public abstract class AbstractSubject implements Subject {
   private Vector<Observer> vector = new Vector<Observer>();
   @Override
   public void add(Observer observer) {
       vector.add(observer);
   }

   @Override
   public void delete(Observer observer) {
       vector.remove(observer);
   }

   @Override
   public void notifyObservers() {
       Enumeration<Observer> enumo = vector.elements();
       while(enumo.hasMoreElements()){
           enumo.nextElement().update();
       }

   }

}

 

主对象:


public class mySubject extends AbstractSubject {
   @Override
   public void operation() {
       System.out.println("update self");
       notifyObservers();
   }
}

 

测试:


public class Test {
   public static void main(String[] args){
       Subject su=new mySubject();
       su.add(new myObserver1());
       su.add(new myObserver2());
       su.operation();
   }
}


结果:

 



源码:


链接: https://pan.baidu.com/s/15nzQHIsCLJmdIUBdDQzd5Q 

密码: 4qjs






【框架合集】SpringMVC教程汇总


【框架合集】Hibernate教程汇总


【框架合集】MyBatis教程汇总


【框架合集】Spring教程汇总


【框架整合】SSM教程


【框架整合】SSH教程


【福利大派送】


专业 热爱 专注

致力于最高效的Java学习

Java大联盟


文章转载自Java大联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论