23のデザインパターン(2) - シングル責任モード

シングル責任モード

デコレーター:Decoratorパターン

典型的には、クラス延ばす機能が、継承を使用して実装されます。
継承しかし、静的特徴を有する高結合、および伸長の増加と、それはサブクラスを拡張します。
この時点では、追加の機能を提供するために、同じ前提のクラス構造の実際のオブジェクトを維持するのに関係の組み合わせを使用して実際のオブジェクトをラップするラッパーオブジェクト(すなわち、装飾品)を作成することができます。

GoFのDecoratorパターンの定義:
ダイナミック(組み合わせ)オブジェクトには、いくつかの追加の責任を追加します。
機能的に増加し、Decoratorパターンは、サブクラス(継承)(数重複コードサブクラス&減少の排除)よりも柔軟です。

eg1:
/**
 * @author lillcol
 * 2019/6/15-23:56
 */
public abstract class Component { //基础接口
    abstract void operation();
}

class ConcreteComponent1 extends  Component{//具体实现类1

    @Override
    void operation() {
        System.out.println("from ConcreteComponent1 operation");
    }
}

class ConcreteComponent2 extends  Component{//具体实现类2

    @Override
    void operation() {
        System.out.println("from ConcreteComponent2 operation");
    }
}
class Decorator extends Component{ //装饰类
    Component component ;
    public Decorator( Component component){
        this.component=component;
    }
    @Override
    void operation() {
        component.operation();
    }
}

class ConcreteDecoratorA extends  Decorator{//具体装饰类A
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    public  void operation(){
        System.out.println("ConcreteDecoratorA operation");
        this.component.operation();
    }

}


class ConcreteDecoratorB extends  Decorator{//具体装饰类B
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    public  void operation(){
        System.out.println("ConcreteDecoratorB operation stag1");
        this.component.operation();
        System.out.println("ConcreteDecoratorB operation stag2" );
    }

}

class DecoratorTest{ //测试
    public static void main(String[] args) {
        ConcreteComponent1 concreteComponent1 = new ConcreteComponent1();
        ConcreteDecoratorA concreteDecoratorA = new ConcreteDecoratorA(concreteComponent1);
        concreteDecoratorA.operation();
        ConcreteDecoratorB concreteDecoratorB = new ConcreteDecoratorB(concreteComponent1);
        concreteDecoratorB.operation();

        System.out.println("------------------------------------------------------------------");

        ConcreteComponent2 concreteComponent2 = new ConcreteComponent2();
        ConcreteDecoratorA concreteDecoratorA2 = new ConcreteDecoratorA(concreteComponent2);
        concreteDecoratorA2.operation();
        ConcreteDecoratorB concreteDecoratorB2 = new ConcreteDecoratorB(concreteComponent2);
        concreteDecoratorB2.operation();

    }
}
//输出结果:
ConcreteDecoratorA operation
from ConcreteComponent1 operation
ConcreteDecoratorB operation stag1
from ConcreteComponent1 operation
ConcreteDecoratorB operation stag2
------------------------------------------------------------------
ConcreteDecoratorA operation
from ConcreteComponent2 operation
ConcreteDecoratorB operation stag1
from ConcreteComponent2 operation
ConcreteDecoratorB operation stag2

デコレータのクラス図:
図デコレータークラス.PNG

装飾的なパターンは、主に次の役割が含まれています。

  1. 抽象コンポーネント(部品)の役割:追加の責任を受信する準備ができてオブジェクトを調節するために抽象インタフェースを定義します。
  2. 特定のコンポーネント(コンクリートコンポーネント)役割:装飾的な役割によって、その責任の一部を追加し、抽象コンポーネントを達成します。
  3. 抽象(デコレータ)装飾的な役割:抽象メンバを継承し、そして特定のメンバ関数がそのサブクラスによって拡張することができ、特定のメンバーの例を含みます。
  4. 具体的な装飾(ConcreteDecorator)役割:装飾的な抽象メソッドの実装に依存し、特定のコンポーネントの対象や拡張== ==責任を追加します。

装飾的価値の嘘をデコレータ、彼は自身がコア機能に装飾されたクラスには影響を与えません。相続のシステムでは、サブクラス通常は相互に排他的。

  • ブリッジ:ブリッジモード

スキーマ定義:抽象(ビジネス機能)と部品(プラットフォーム)を実装し、彼らが独立に変化させることができるように、分離しました。

一部のクラスは、変更の2つの以上のディメンションを持つ異なるファイル形式の異なるプラットフォームやメディアプレーヤーをサポートしています。
どのように再生ソフトウェアを設計するために、メディアプレーヤーは、異なるプラットフォームや異なるファイル形式を再生することができますか?
相続、インターネットやファイルフォーマットのm種類の組み合わせは、n個のn種類×メートルだけでなく、多くの対応するサブクラスを持っている、そして拡張が困難である場合。

ブリッジクラス図:
ブリッジクラス図.PNG

:橋(ブリッジ)モードは、次の主要な役割が含まれている
抽象化(抽象化)の役割を抽象クラスの定義をし、オブジェクトの実現への参照が含まれています。
拡張抄録(RefinedAbstraction)角色:ビジネス方法親クラスを達成するための抽象サブクラスの役割、および役割を呼び出すビジネス関係を達成するための方法を組み合わせて。
(実装側)の役割の実現:拡張抽象ロールコールのためのインターフェースの実現の役割を定義します。
(ConcreteImplementor)役割の具体的な実現インタフェースの特定の実装の役割を与えられた達成するために:。

ケースコード:

eg1
/**
 * @author lillcol
 * 2019/6/16-17:17
 */
public class Bridge {
    public static void main(String[] args) {
        ConcreteImplementorA1 concreteImplementorA1 = new ConcreteImplementorA1();
        ConcreteImplementorB2 concreteImplementorB2 = new ConcreteImplementorB2();
        RefinedAbstraction refinedAbstraction = new RefinedAbstraction(concreteImplementorA1, concreteImplementorB2);
        refinedAbstraction.operation();
    }
}

abstract class ImplementorA{ //定义实现接口:平台
    abstract void implementA();
}
class ConcreteImplementorA1 extends ImplementorA{//定义实现类:平台 P1

    @Override
    void implementA() {
        System.out.println("采用平台: ConcreteImplementorA1 P1");
    }
}

class ConcreteImplementorA2 extends ImplementorA{//定义实现类:平台 P2

    @Override
    void implementA() {
        System.out.println("采用平台: ConcreteImplementorA2 P2");
    }
}

abstract class ImplementorB{ //定义实现接口:格式
    abstract void implementB();
}

class ConcreteImplementorB1 extends  ImplementorB{//定义实现类:格式 F1

    @Override
    void implementB() {
        System.out.println("采用格式: ConcreteImplementorB1 F1");
    }
}

class ConcreteImplementorB2 extends  ImplementorB{//定义实现类:格式 F2

    @Override
    void implementB() {
        System.out.println("采用格式: ConcreteImplementorB2 F2");
    }
}

abstract class Abstraction{
    ImplementorA implementorA;
    ImplementorB implementorB;
    Abstraction(ImplementorA implementorA,ImplementorB implementorB){
        this.implementorA=implementorA;
        this.implementorB=implementorB;
    };
    abstract void operation();
}

class RefinedAbstraction extends  Abstraction{

    RefinedAbstraction(ImplementorA implementorA, ImplementorB implementorB) {
        super(implementorA, implementorB);
    }

    @Override
    void operation() {
        implementorA.implementA();
        implementorB.implementB();
    }
}
//输出结果:
采用平台: ConcreteImplementorA1 P1
采用格式: ConcreteImplementorB2 F2

長所橋(ブリッジ)モードは、次のとおり
による抽象化と分離し、拡張機能、
クライアントへの実装の詳細は透明。

欠点は:
抽象化層の上に構築された集約関係に起因して、システムの設計を理解することの難しさを増加させる抽象化のための設計及びプログラミングの開発を必要とします。

参考資料:
http://c.biancheng.net/view/1364.html
李Jianzhong 23のデザインパターン

おすすめ

転載: www.cnblogs.com/lillcol/p/11129937.html