软件构造设计模式(下)

软件构造设计模式(下)

Iterator

Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。

Iterable接口:自己的集合类实现
Iterator接口:主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。Iterator接口包含三个基本方法,next(),hasNext(),remove()
iterator方法:返回一个iterator的实现

注:在遍历时,迭代变量所获得的是集合元素的值,而不是集合元素本身。

自定义迭代器

public class XX<E> implements Iterable<E>{
	public Iterator<E> iterator(){
		return new XXIterator():
	}
	private class XXIterator implements Iterator<E>{
		public boolean hasNext(){...}
		public E next(){...}
		public void remove(){...}
	}
}

客户端

隐式迭代器
XX<String> xx = new XX<String>(...);
for(String s:xx){...}
显式迭代器
Iterator<String> iterator = yy.iterator();

Facade外观模式

是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

Facade类

将客户的请求代理给适当的子系统对象

public class Facade{
	XX a;
	YY b;
	public Facade(){
		a = new XX();
		b = new YY();
	}
	public void method1(){
		this.a.function1();
	}
	public void method1(){
		this.b.function2();
	}
}

子系统

处理Facade指派的任务

public class XX{
	public void function1(){
		...
	}
}
public class YY{
	public void function2(){
		...
	}
}

客户端

Facade facade = new Facade();
facade.method1();
facade.method2():

Proxy代理模式

隔离对复杂对象的访问

Subject抽象角色

通过接口或抽象类声明真实角色实现的业务方法。

public interface Subject{
	void XX();
}

RealSubject代理角色

实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

public RealSubject implements Subject{
	public RealSubject(Object o){
		this.o = o;
	}
	@Override
	public void XX(){
		......
	}
}

Proxy真实角色

实现抽象角色,定义真实角色所要实现业务逻辑,供代理角色。

public class Proxy implements Subject{
	public Proxy(Object o){
		this.o = o;
	}
	@Override
	public void XX(){
		new RealSubject(Object o).XX();
	}

客户端

new Proxy(Object o).XX();

Factory/Abstract Factory

State

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它所属的类。

Context类(环境角色)

定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。

class Context{
	State state;
	public Context(State s){
		state = s;
	}
	public int XX(){//具体操作(状态转换)
		return state.XX();
	}
	......
}

State接口(抽象状态角色)

定义一个接口,用来封装环境对象的一个特定的状态所对应的行为。

public interface State{
	public int XX();
}

State的实现类(具体状态角色)

每一个状态类都实现了环境的一个状态所对应的行为。

public class State1 implements State{
	@Override
	public int XX(){...}
}

Memento备忘录模式

在不破坏封闭的前提下,捕获并外部化一个对象的内部状态,这样之后就可以将该对象恢复到保存时的状态。

Memento类

class Memento{
	private State state;
	public Memento(State state){
		this.state = state;
	}
	public State getState(){
		return state;
	}
}

Caretaker类

class Caretaker{
	private List<Memento> mementos = new ArrayList<>():
	public void addMemento(Memento m){
		mementos.add(m);
	}
	public Memento getState(){
		return mementos.get(?);
	}
}

Originator类

class Originator{
	private State state;
	public void setState(State state){
		this.state = state;
	}
	public Memento save(){//记录当前状态
		return new Memento(state);
	}
	public void restore(Memento m){//恢复历史状态
		state = m.getState();
	}
}

客户端

Careteker caretaker = new Caretaker():
Originator originator = new Originator():
originator.setState(...);
caretaker.addMemento(originator.save());
orginator.restore(caretaker.getMemento());

Originator相当于具有状态的对象;Caretaker负责记录历史状态集合,兼回滚的功能;Memento负责保存单个状态;客户端不涉及Memento的实例。

比较器

两种方法

Comparable内部比较器

实现Comparable接口,重写CompareTo 方法

...implements Comparable<Object>{
	@Override
	public int compareTo(Object o){...}
}
  • 客户端
Collections.sort(...);

Comparator外部比较器

重写compare方法

...implements Comparator<Object>{
	@Override
	public int compare(Object o1,Object o2){...}
}
  • 客户端
Collections.sort(...,new Comparator<...>());
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值