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());
}
}
}
结果:1 2 3 4 5
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();
}
}
结果:
类图如下:
全部评论