设计模式(二)结构模式(适配器模式、双向适配器模式、装饰模式)

来源:互联网 发布:淘宝认证照片拍摄技巧 编辑:程序博客网 时间: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();
}
}
阅读全文
0 0
原创粉丝点击