设计模式(二)结构模式(适配器模式、双向适配器模式、装饰模式)
来源:互联网 发布:淘宝认证照片拍摄技巧 编辑:程序博客网 时间:2024/05/27 14:14
创建模式是创建对象
结构模式是组合对象
行为模式是模块和模块之间发生行为
适配器模式 (spring)
//B到A里面,A主动,B为被动方会切换,叫单向适配器模式,主动方Adaptor,被动方Adaptee
class A{
public void funA(){
System.out.println("A");
}
}
interface IExtendModule{
public abstract void extendFun();
}
class B implements IExtendModule{
public void extendFun(){
System.out.println("B");
}
}
class C implements IExtendModule{
public void extendFun(){
System.out.println("B或者C");
}
}
class SubA extends A{
private IExtendModule iem;
public SubA(IExtendModule iem){
this.iem = iem;
}
public void funA(){
super.funA();//值得一提,这句代码如果去掉,就是著名的功能替换
iem.extendFun();
}
}
public class Adapter1{
public static void main(String args[]){
B b = new B();
//C c = new C();
SubA subA = new SubA(b);
//SubA subA = new SubA(c);
subA.funA();
}
}
==============================================================================
双向适配器模式
//B方法B1到A方法A1,A方法A2到B方法B2,叫双向适配器模式
//相当于打开一个A界面,然后再打开一个B界面,改变B的属性,可以浏览到A界面变动,点击取消可以恢复
变动
//缺陷扩展模块无法很好的应付主模块的切换
class A{
public void funA1(){
System.out.println("A.funA1");
}
public void funA2(){
System.out.println("A.funA2");
}
}
class B{
public void funB1(){
System.out.println("B.funB1");
}
public void funB2(){
System.out.println("B.funB1");
}
}
class AB{//组合A和B
private A a;
private B b;
public void setA(A a){
this.a = a;
}
public void setB(B b){
this.b = b;
}
public void funA1(){
a.funA1();
b.funB1();
}
public void funB2(){
b.funB2();
a.funA2();
}
}
public class Adapter2{
public static void main(String args[]){
AB ab = new AB();
ab.setA(new A());
ab.setB(new B());
//ab.funA1();
ab.funB2();
}
}
优化双向适配器模式
interface IA{
public abstract void funA1();
public abstract void funA2();
}
class A impelement IA{
public void funA1(){
System.out.println("A.funA1");
}
public void funA2(){
System.out.println("A.funA2");
}
}
interface IB{
public abstract void funB1();
public abstract void funB2();
}
class B impelement IB{
public void funB1(){
System.out.println("B.funB1");
}
public void funB2(){
System.out.println("B.funB1");
}
}
class AB implements IA,IB{//组合A和B
private IA ia;
private IB ib;
public void setIA(IA ia){
this.ia = ia;
}
public void setIB(IB ib){
this.ib = ib;
}
public void funA1(){
ia.funA1();//这句话如果替换就是功能替换
ib.funB1();
}
public void funB2(){
ib.funB2();//这句话如果替换就是功能替换
ia.funA2();
}
//面向接口编程后会丢方法,还需要重新其他功能
public void funA2(){
ia.funA2();
}
public void funB1(){
ib.funB1();
}
}
public class Adapter2{
public static void main(String args[]){
AB ab = new AB();
ab.setIA(new A());
ab.setIB(new B());
//ab.funA1();
ab.funB2();
}
}
=======================================================
装饰模式
要点:主模块接口注入扩展模块
interface IRead{
public abstract void read();
}
class ReadStrFromFile implements IRead{//主模块,可能会变动
public void read(){
System.out.println("读取字符串");
}
}
class ReadStrFromNet implements IRead{//主模块,可能会变动
public void read(){
System.out.println("读取字符串");
}
}
//可以用Spring装配,可以为任何实现了IRead接口的类服务
class Convert{//附模块,可以为主模块服务,或者其他主模块服务
private IRead iread;
public Convert(IRead iread){
this.iread = iread;
}
public void convertToUpper(){
iread.read();
System.out.println("转大写");
}
}
public class Decorator2{
public static void main(String args[]){
Convert convert = new Convert(new ReadStrFromFile());
convert.convertToUpper();
}
}
结构模式是组合对象
行为模式是模块和模块之间发生行为
适配器模式适合主一对附多,装饰模式适合主多对附一
适配器模式 (spring)
//B到A里面,A主动,B为被动方会切换,叫单向适配器模式,主动方Adaptor,被动方Adaptee
class A{
public void funA(){
System.out.println("A");
}
}
interface IExtendModule{
public abstract void extendFun();
}
class B implements IExtendModule{
public void extendFun(){
System.out.println("B");
}
}
class C implements IExtendModule{
public void extendFun(){
System.out.println("B或者C");
}
}
class SubA extends A{
private IExtendModule iem;
public SubA(IExtendModule iem){
this.iem = iem;
}
public void funA(){
super.funA();//值得一提,这句代码如果去掉,就是著名的功能替换
iem.extendFun();
}
}
public class Adapter1{
public static void main(String args[]){
B b = new B();
//C c = new C();
SubA subA = new SubA(b);
//SubA subA = new SubA(c);
subA.funA();
}
}
==============================================================================
双向适配器模式
//B方法B1到A方法A1,A方法A2到B方法B2,叫双向适配器模式
//相当于打开一个A界面,然后再打开一个B界面,改变B的属性,可以浏览到A界面变动,点击取消可以恢复
变动
//缺陷扩展模块无法很好的应付主模块的切换
class A{
public void funA1(){
System.out.println("A.funA1");
}
public void funA2(){
System.out.println("A.funA2");
}
}
class B{
public void funB1(){
System.out.println("B.funB1");
}
public void funB2(){
System.out.println("B.funB1");
}
}
class AB{//组合A和B
private A a;
private B b;
public void setA(A a){
this.a = a;
}
public void setB(B b){
this.b = b;
}
public void funA1(){
a.funA1();
b.funB1();
}
public void funB2(){
b.funB2();
a.funA2();
}
}
public class Adapter2{
public static void main(String args[]){
AB ab = new AB();
ab.setA(new A());
ab.setB(new B());
//ab.funA1();
ab.funB2();
}
}
优化双向适配器模式
interface IA{
public abstract void funA1();
public abstract void funA2();
}
class A impelement IA{
public void funA1(){
System.out.println("A.funA1");
}
public void funA2(){
System.out.println("A.funA2");
}
}
interface IB{
public abstract void funB1();
public abstract void funB2();
}
class B impelement IB{
public void funB1(){
System.out.println("B.funB1");
}
public void funB2(){
System.out.println("B.funB1");
}
}
class AB implements IA,IB{//组合A和B
private IA ia;
private IB ib;
public void setIA(IA ia){
this.ia = ia;
}
public void setIB(IB ib){
this.ib = ib;
}
public void funA1(){
ia.funA1();//这句话如果替换就是功能替换
ib.funB1();
}
public void funB2(){
ib.funB2();//这句话如果替换就是功能替换
ia.funA2();
}
//面向接口编程后会丢方法,还需要重新其他功能
public void funA2(){
ia.funA2();
}
public void funB1(){
ib.funB1();
}
}
public class Adapter2{
public static void main(String args[]){
AB ab = new AB();
ab.setIA(new A());
ab.setIB(new B());
//ab.funA1();
ab.funB2();
}
}
=======================================================
装饰模式
要点:主模块接口注入扩展模块
interface IRead{
public abstract void read();
}
class ReadStrFromFile implements IRead{//主模块,可能会变动
public void read(){
System.out.println("读取字符串");
}
}
class ReadStrFromNet implements IRead{//主模块,可能会变动
public void read(){
System.out.println("读取字符串");
}
}
//可以用Spring装配,可以为任何实现了IRead接口的类服务
class Convert{//附模块,可以为主模块服务,或者其他主模块服务
private IRead iread;
public Convert(IRead iread){
this.iread = iread;
}
public void convertToUpper(){
iread.read();
System.out.println("转大写");
}
}
public class Decorator2{
public static void main(String args[]){
Convert convert = new Convert(new ReadStrFromFile());
convert.convertToUpper();
}
}
阅读全文
0 0
- 设计模式(二)结构模式(适配器模式、双向适配器模式、装饰模式)
- 结构型设计模式(一)(适配器模式,桥接模式,组合模式,装饰模式)
- 适配器模式(结构型设计模式)
- 适配器模式(结构型设计模式)
- 设计模式学习(二)适配器模式
- 设计模式(二)适配器模式
- 戏说设计模式(二)适配器模式
- 设计模式学习(二)适配器模式
- 23种设计模式3--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- 23种设计模式--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
- 适配器模式(二)
- 设计模式(适配器模式,外观模式)
- Java 模式3(结构模式) - 适配器模式,缺省适配器模式,合成模式, 装饰模式,代理模式
- 设计模式--结构模式--适配器模式--Java
- 设计模式 - 结构型模式 - 适配器模式
- 设计模式->结构型模式->适配器模式
- 结构模式->适配器模式
- 【备忘】最新python数据分析升级版视频教程
- 音频处理工具 GoldWave / Cool Edit Pro
- peerjs填坑
- ThreadLocal线程本地变量的超详细解析
- 数据特征分析---Python数据挖掘与分析
- 设计模式(二)结构模式(适配器模式、双向适配器模式、装饰模式)
- java多线程学习(十一) 双重检查锁定和延迟初始化
- 线性代数 03.03 线性方程组的解
- <aop:aspect>与<aop:advisor>的区别
- U3D之AnimationCurve
- Angular2父子组件之间数据传递:父子组件共享服务通信
- 播放音视频---MediaPlayer、VideoView
- 计算机认识实习报告
- Java的@Override