赞
踩
假设奶茶店有两种茶,果茶(fruit tea)和奶茶(milky tea),同时这两种茶饮料可以添加不同的配料 果肉(pulp)或者蔗糖(sugar),茶品可以和配料进行组合,所以可以得到:
1、采用单一继承的方式的UML图: 有多少个技能就写多少个子类来继承这个tea类。
可以明显发现一个问题:就是随着物品修饰种类的增加,继承的类也越来越多,每增加一个技能可以组合出N个子类,那不就要加到天荒地老?
2、直接抽象一个tea类,里面包含了所有的配料。
这样子有多少个角色就增加多少个子类就可以了,不用根据技能增加类,避免造成子类爆炸,但是,每个角色的技能是可以叠加使用的,角色越多或者技能叠加种类越多,那么就要在超类增加越多的方法,而且直接修改超类不符合开闭原则(超类对扩展开放,对修改关闭)。
综上:
为什么建议使用组合代替继承?
面向对象的特性有继承与封装,但两者却又有一点矛盾,继承意味子类依赖了父类中的实现,一旦父类中改变实现则会对子类造成影响,这是打破了封装性的一种表现. 而组合就是巧用封装性来实现继承功能的代码复用.
1.定义:
-装饰器模式又名包装(Wrapper)模式。动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
UML关系图说明:
继承关系:实线、空三角箭头 ,具体装饰继承Decorator,Decorator
继承Component
; 聚合:实线、菱形
1、抽象构件(Component)角色:一个抽象接口。装饰对象和被装饰对象【具体组件对象】共有的父类接口。这样客户端对象就能以相同的方式操作具体组件对象和装饰对象【或者说可以将装饰类作为组件类看待】
2、具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。装饰模式是为这个基类动态添加新功能。
3、装饰(Decorator)角色:装饰对象包含一个真实组件对像的引用。它的作用是接受需要扩展功能的具体组件类;实现抽象组件接口,使得在动态添加功能时具体装饰类和具体组件类用法相同,使模式更加灵活。
4、具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。
优点:
缺点:
//被装饰者的对象接口
public interface Drink {
public float cost();
public String desc();
}
//具体的被装饰者
public class Dounai implements Drink{
@Override
public float cost() {
return 3f;
}
@Override
public String desc() {
return "纯豆奶";
}
}
//装饰者的基类 public abstract class Decroator implements Drink { private Drink drink; //要装饰的对象 public Decroator(Drink drink) { this.drink = drink; } @Override public float cost() { return drink.cost(); } @Override public String desc() { return drink.desc(); } }
//具体的装饰者 public class Blackdou extends Decroator { public Blackdou(Drink drink) { super(drink); } @Override public float cost() { return super.cost()+2f; } @Override public String desc() { return super.desc()+"+黑豆"; } }
//具体的装饰者类
public class SugarDecroator extends Decroator {
public SugarDecroator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost()+1f;
}
@Override
public String desc() {
return super.desc()+"+糖";
}
}
//具体的装饰者类
public class SugarDecroator extends Decroator {
public SugarDecroator(Drink drink) {
super(drink);
}
@Override
public float cost() {
return super.cost()+1f;
}
@Override
public String desc() {
return super.desc()+"+糖";
}
}
实验结果
这杯豆浆价格为:6.0
描述为:纯豆奶+黑豆+糖
Observable类
/** * 被观察者的核心抽象类 * 也是使用框架的入口 * @param <T> */ public abstract class Observable<T> implements ObservableSource<T> { @Override public void subscribe(Observer observer) { // 和谁建立订阅? // 怎么建立订阅? // 为了保证拓展性,交给具体的开发人员实现。这里提供一个抽象的方法 subscribeActual(observer); } protected abstract void subscribeActual(Observer<T> observer); //creat操作符 public static <T> Observable<T> create(ObservableOnSubscribe<T> source){ return new ObservableCreate<>(source); } //map操作符 public <R> ObservableMap<T, R> map(Function<T, R> function) { return new ObservableMap<>(this, function); } //flatmap操作符 public <R> ObservableFlatMap<T, R> flatMap(Function<T, ObservableSource<R>> function) { return new ObservableFlatMap<>(this, function); } }
Observer接口
public interface Observer<T> {
void onSubscribe();//建立订阅关系时候的回掉方法,什么时候和被观察者建立订阅关系,就会调用该方法
void onNext(T t);
void onComplete();
void onError(Throwable throwable);
}
ObservableCreate类
/** * 1、创建一个被观察者 * 2、被观察者发射事件由具体的either发射器来完成 * @param <T> */ public class ObservableCreate<T> extends Observable<T> { final ObservableOnSubscribe<T> source; public ObservableCreate(ObservableOnSubscribe<T> source) { this.source = source;//创建一个被观察者 } @Override protected void subscribeActual(Observer<T> observer) { observer.onSubscribe();//建立订阅的时候调用 CreateEmitter<T> emitter = new CreateEmitter<T>(observer); source.subscribe(emitter); } static class CreateEmitter<T> implements Emitter<T>{ Observer<T>observer;//这里持有一个观察者,当事件发生时,直接调用该观察者对事件进行调用即可。 boolean done;//互斥实现 public CreateEmitter(Observer<T> observer){ this.observer = observer; } public void onNext(T t){ if(done) return; observer.onNext(t); } public void onError(Throwable throwable){ if(done) return; observer.onError(throwable); done = true; } public void onComplete(){ if(done) return; observer.onComplete(); done = true; } } }
Emitter接口
/**
* 事件发射器
* @param <T>
*/
public interface Emitter<T> {
void onNext(T t);
void onComplete();
void onError(Throwable throwable);
}
ObservableOnSubscribe接口
/**
* 被观察者和事件发射器建立关系
* 被观察者和事件之间解偶
* @param <T>
*/
public interface ObservableOnSubscribe<T> {
void subscribe(Emitter<T> emitter);
}
ObservableSource接口
/**
* 被观察者的顶层接口
* @param <T>
*/
public interface ObservableSource<T> {
void subscribe(Observer<T>observer);
}
Function接口
/**
* 数据源转换函数
* @param <T>
* @param <R>
*/
public interface Function<T,R>{
R apply(T t);
}
ObservableMap
public class ObservableMap<T, U> extends AbstractObservableWithUpStream<T, U> { Function<T, U> function; public ObservableMap(ObservableSource<T> source, Function<T, U> function) { super(source); this.function = function; } @Override protected void subscribeActual(Observer<U> observer) { source.subscribe(new MapObserver<>(observer,function)); } static class MapObserver<T, U> implements Observer<T> { final Observer<U> downStream; final Function<T, U> mapper; public MapObserver(Observer<U> downStream, Function<T, U> mapper) { this.downStream = downStream; this.mapper = mapper; } @Override public void onSubscribe() { downStream.onSubscribe(); } @Override public void onNext(T t){ //map操作符的具体实现 U u = mapper.apply(t); downStream.onNext(u); } @Override public void onComplete(){ downStream.onComplete(); } @Override public void onError(Throwable throwable){ downStream.onError(throwable); } } }
AbstractObservableWithUpStream
/**
* 抽象装饰类
* @param <T>
* @param <U>
*/
public abstract class AbstractObservableWithUpStream<T,U> extends Observable<U>{
protected final ObservableSource<T> source;//在这个基础上进行装饰
public AbstractObservableWithUpStream(ObservableSource<T>source){
this.source = source;
}
}
RxjavaTest
public class RxjavaTest { public static void main(String[] args) { Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(Emitter<Object> emitter) { System.out.println("subscribe:....."); emitter.onNext("aaaa"); emitter.onNext("CCCC"); emitter.onNext("ddddd"); emitter.onError(new Throwable()); emitter.onComplete(); } }).map(new Function<Object, Object>() { @Override public Object apply(Object o) { return "处理后的+ " + o; } }) /*.flatMap(new Function<Object, ObservableSource<Object>>() { @Override public ObservableSource<Object> apply(Object o) { return Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(Emitter<Object> emitter) { emitter.onNext("处理后的" + o); } }); } })*/ .subscribe(new Observer() { @Override public void onSubscribe() { System.out.println("onSubscribe..."); } @Override public void onNext(Object o) { System.out.println("onNext:.... " + o); } @Override public void onComplete() { System.out.println("onComplete:... "); } @Override public void onError(Throwable throwable) { System.out.println("onError :... "); } }); } }
实验结果
onSubscribe...
subscribe:.....
onNext:.... 处理后的:aaaa
onNext:.... 处理后的:CCCC
onNext:.... 处理后的:ddddd
onError :...
ObservableFlatMap
public class ObservableFlatMap<T, U> extends AbstractObservableWithUpStream<T, U> { Function<T, ObservableSource<U>> function; public ObservableFlatMap(ObservableSource<T> source, Function<T, ObservableSource<U>> function) { super(source); this.function = function; } @Override protected void subscribeActual(Observer<U> observer) { source.subscribe(new MergeObserver<>(observer, function)); } static class MergeObserver<T, U> implements Observer<T> { final Observer<U> downStream; final Function<T, ObservableSource<U>> mapper; public MergeObserver(Observer<U> downStream, Function<T, ObservableSource<U>> mapper) { this.downStream = downStream; this.mapper = mapper; } @Override public void onSubscribe() { downStream.onSubscribe(); } @Override public void onNext(T t) { ObservableSource<U> observable = mapper.apply(t); observable.subscribe(new Observer<U>() { @Override public void onSubscribe() { } @Override public void onNext(U u) { downStream.onNext(u); } @Override public void onComplete() { } @Override public void onError(Throwable throwable) { } }); } @Override public void onComplete() { downStream.onComplete(); } @Override public void onError(Throwable throwable) { downStream.onError(throwable); } } }
RxjavaTest
public class RxjavaTest { public static void main(String[] args) { Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(Emitter<Object> emitter) { System.out.println("subscribe:....."); emitter.onNext("aaaa"); emitter.onNext("CCCC"); emitter.onNext("ddddd"); emitter.onError(new Throwable()); emitter.onComplete(); } }).flatMap(new Function<Object, ObservableSource<Object>>() { @Override public ObservableSource<Object> apply(Object o) { return Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(Emitter<Object> emitter) { emitter.onNext("处理后的" + o); } }); } }) .subscribe(new Observer() { @Override public void onSubscribe() { System.out.println("onSubscribe..."); } @Override public void onNext(Object o) { System.out.println("onNext:.... " + o); } @Override public void onComplete() { System.out.println("onComplete:... "); } @Override public void onError(Throwable throwable) { System.out.println("onError :... "); } }); } }
实验结果
在onSubscribe...
subscribe:.....
onNext:.... 处理后的aaaa
onNext:.... 处理后的CCCC
onNext:.... 处理后的ddddd
onError :...
Process finished with exit code 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。