package com.jelly.mypattern.composite; /** * 抽象构件 * 这是一个抽象角色,它给参与组合的对象定义出公共的接口及默认行为 */ public interface Component { //示例操作方法 public void sampleOperation(); //返回自己 public Composite getComposite(); }
package com.jelly.mypattern.composite; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 树枝组件 * 可以有子节点--树枝或树叶节点 * @author jelly */ public class Composite implements Component{ private List<Component> comList=new ArrayList<Component>(); //操作方法 @Override public void sampleOperation() { for(Component component :comList){ component.sampleOperation(); } } //返回自身 @Override public Composite getComposite() { return this; } /** * 管理聚集的方法 添加 * @param component */ public void add(Component component){ comList.add(component); } /** * 管理聚集的方法 删除 * @param component */ public void remove(Component component){ comList.remove(component); } /** * 返回管理聚集的迭代器对象 * @return */ public Iterator<Component> iterator(){ return comList.listIterator(); } }
package com.jelly.mypattern.composite; /** * 树叶组件 * @author jelly * */ public class Leaf implements Component{ @Override public void sampleOperation() { System.out.println("leaf some operation..."); } @Override public Composite getComposite() { return null; } }
package com.jelly.mypattern.composite; /** * 客户端测试代码 * @author jelly * */ public class CompositeTest { public static void main(String[] args) { Component com=new Composite(); Composite componsite= com.getComposite(); Component leaf1=new Leaf(); Component leaf2=new Leaf(); Component leaf3=new Leaf(); Component leaf4=new Leaf(); componsite.add(leaf1); componsite.add(leaf2); Component comsite=new Composite(); comsite.getComposite().add(leaf3); comsite.getComposite().add(leaf4); componsite.add(comsite); componsite.sampleOperation(); } }
package com.jelly.mypattern.adapter; import java.util.Enumeration; import java.util.Iterator; /** * Itermeration * 从 Iterator 到Enumerator 的适配。 * Itermeration 名称取自Iterator的前部分和Enumeration的后部分 * @author jelly * */ public class Itermeration<E> implements Enumeration<E> { private Iterator<E> it; public Itermeration(Iterator<E> it) { this.it=it; } @Override public boolean hasMoreElements() { return it.hasNext(); } @Override public E nextElement() { return it.next(); } }
package com.jelly.mypattern.adapter; import java.util.Enumeration; import java.util.Iterator; /** * Enuterator * 从Enumerator 到Iterator 的适配。 * Enuterator 名称取自Enumerator的前部分和Iterator的后部分 * @author jelly * */ public class Enuterator<E> implements Iterator<E>{ private Enumeration<E> enu; public Enuterator(Enumeration<E> enu ) { this.enu=enu; } @Override public boolean hasNext() { return enu.hasMoreElements(); } @Override public E next() { return enu.nextElement(); } @Override public void remove() { throw new UnsupportedOperationException(); } }
package com.jelly.mypattern.decorator; /** * 抽象组件 * @author jelly * */ public interface IComponent { /** * 组件显示 通知消息 * @param msg */ public void showMsg(String msg); /** * 组件显示 警告消息 * @param name */ public void showWarning(String warning); }
package com.jelly.mypattern.decorator; /** * 具体的某个组件 实现IComponent接口 * @author jelly * */ public class Component implements IComponent{ @Override public void showMsg(String msg) { System.out.println("message: "+msg); } @Override public void showWarning(String warning) { System.out.println("warning: "+warning); } }
package com.jelly.mypattern.decorator; /** * ComponentDecorator 类 * 是 Componet的装饰类,与Component类实现相同的接口, * 并在后者的基础上进行功能的增强 * @author jelly * */ public class ComponentDecorator implements IComponent{ private Component component; public ComponentDecorator(Component component) { this.component=component; } @Override public void showMsg(String msg) { System.out.println("please read the message ."); component.showMsg(msg); } @Override public void showWarning(String warning) { component.showWarning(warning); System.out.println("your alarm sounded!!!"); } }
package com.jelly.mypattern.decorator; /** * 客户端测试类 * @author jelly * */ public class DecoratorTest { /** * Decorator * 装饰模式: * 1 装饰器通常与被装饰者实现相同的接口,并持有被装饰者的对象引用 * 2 装饰器在不改变原有接口的基础上进行功能的增强(称为纯粹的装饰器) * 3 大多数情况下装饰器在增强功能的同时还会新增新的方法,称为非纯装饰器。 * 如JDK类库中BufferedReader 是reader的装饰类,增强了reader的功能, * 但同时也引加入了一个新的readLine方法,使得BufferedReader 不能够使用父类Reader * 来引用自身。这种现象在jdk io类库中是否常见。 * 对于装饰器类而言,纯粹的装饰类十分少见,非纯装饰类十分常见,它们处于装饰模式与适配器模式之间(尽管如此我们依然称它为装饰器类) * 它们含有的新方法越多,则它离装饰模式越远,离适配器模式越近;含有的新方法越少,则离装饰器模式越近,离适配器模式越远。 * * @param args */ public static void main(String[] args) { Component component=new Component(); component.showMsg("Goods morning boys and girls!"); component.showWarning("Hurry up, you're going to be late. "); System.out.println("----------"); ComponentDecorator comDecorator=new ComponentDecorator(component); comDecorator.showMsg("Goods morning boys and girls!"); comDecorator.showWarning("Hurry up, you're going to be late. "); } }
package com.jelly.mypattern.flyWeight; /** * * ‘字 ’ 类 * @author jelly * */ public class Word { //内蕴状态 共享的 不允许外部修改, private String letters;//组成单词的字母 public Word(String letters) { this.letters=letters; } /** * 显示‘字’ ,size 是外蕴状态可以在方法中传入,但方法中不能修改享元实体的内蕴状态 * @param size */ public void display(int size){ System.out.println("【"+letters+"】, display in "+size+" px"); } }
package com.jelly.mypattern.flyWeight; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 生产 ‘字’ 的工厂 * @author jelly * */ public class WordFactory { private static WordFactory wordFactory=new WordFactory(); private Map<String,Word> wordCache=new HashMap<String,Word>(); /** * 私有化构造函数 */ private WordFactory(){ } /** * 暴露一个静态工厂方法,返回自身的唯一实例 * 享元工厂 * @return */ public static WordFactory getInstance(){ return wordFactory; } /** * 生产 ‘字’ 的方法 线程同步方法 * @param letters * @return */ public synchronized Word getWord(String letters){ Word word=wordCache.get(letters); if(word==null){ word=new Word(letters); wordCache.put(letters, word); } return word; } //遍历显示缓存池中所有的享元对象。 public void dispayAllWord(){ Set<Entry<String, Word>> entrySet= wordCache.entrySet(); for(Entry<String, Word> en: entrySet){ System.out.println(en.getKey()+"-->"+en.getValue()); } } }
package com.jelly.mypattern.flyWeight; public class FlyWeightTest { /** * 享元模式 * 1 当应用系统中存在大量可共享的微小的对象时,可以考虑使用享元模式 * 2 享元模式需要一个享元工厂来维护享员对象的集合,该工厂通常是单例的。 * 3 享元对象之所以可以被很多客户端共享,是因为它们只含只含有可共享的状态 * 4 享元模式要求享元对象必须是可共享的而不是状态不变的。 */ public static void main(String[] args) { WordFactory factory=WordFactory.getInstance(); Word word1=factory.getWord("hello"); word1.display(10); Word word2=factory.getWord("hello"); word2.display(12); Word word3=factory.getWord("good"); word3.display(13); System.out.println("word1 的内存地址:"+word1); System.out.println("word2 的内存地址:"+word2); if(word1==word2){ //如果内存地址相等,说明从工厂中得到的同一个 共享对象 (享元对象) System.out.println("从工厂中得到的同一个共享对象 (享元对象)"); } factory.dispayAllWord(); } }
上一篇:java设计模式(二)
下一篇:java设计模式(四)
Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1