[Ava]設計モード-作成、構造、動作モード


デザインモード


常用設計モードを定型化することで,タイプ別に最適な方法で開発する.

Gofデザインモード


オブジェクト向けのコンセプトに基づいて,設計で再利用する際に有用な設計を設計モードに整理する.
Gofデザインモデルをよく理解し運用できれば、良いソフトウェアデザインができます.

長所

  • 開発者と設計者の間でスムーズなコミュニケーションが可能です.
  • ソフトウェアの構造を把握しやすい.
  • を再利用することで開発時間を短縮した.
  • は、設計変更、修正要求に柔軟に対応することができる.
  • 短所

  • オブジェクト向けの概念を理解し、オブジェクト向けの設計と実施を行う必要があります.
  • 初期投資費用は負担できる.
  • 1.アレイの作成


    オブジェクトの作成に関連するモードでは、オブジェクトの作成と変更がシステム全体に及ぼす影響を最小限に抑え、コードの柔軟性を向上させることができます.Singleton Factory Method Prototype Builder Abstart Factory Chaining

    1.1. モノトーンモード

  • モノトーンモードは、任意のオブジェクトに対して1つしか存在しません.
  • は、主に、サーバに接続されたconnectオブジェクトなどのリソースを共有するために使用される.
  • 作成したオブジェクトは、
  • getInstance()メソッドで作成または取得できます.
  • SocketClient.java

    package com.company.designpattern.singleton;
    
    public class SocketClient {
    
        private static SocketClient socketClient = null;
        
        private SocketClient() {
        }
    
        public static SocketClient getInstance() {
            if (socketClient == null) {
                socketClient = new SocketClient();
            }
            return socketClient;
        }
    
        public void connect() {
            System.out.println("connect");
        }
    }
  • モノトーンオブジェクトは、独自のオブジェクトを持つ必要があります.
  • 基本ジェネレータで生成することはできません.これをプライベートと宣言し、外部から非表示にします.
  • SocketA.java

    package com.company.designpattern.singleton;
    
    public class SocketA {
    
        private SocketClient socketClient;
    
        public SocketA() {
            this.socketClient = SocketClient.getInstance();
        }
    
        public SocketClient getSocketClient() {
            return this.socketClient;
        }
    }

    SocketB.java

    package com.company.designpattern.singleton;
    
    public class SocketB {
    
        private SocketClient socketClient;
    
        public SocketB() {
            this.socketClient = SocketClient.getInstance();
        }
    
        public SocketClient getSocketClient() {
            return this.socketClient;
        }
    }
  • SocketAおよびSocketBは、SocketClientオブジェクトを受信する同じコードを有する.
  • のように複数のオブジェクトにモノトーンオブジェクトを作成すると、同じオブジェクトが共有されます.
  • とは対照的に、新しい予約語によって生成されたオブジェクトは、生成されるたびに新しいオブジェクトを取得する.
  • 2.構造パターン


    プログラム内の資料構造やインタフェース構造などのプログラム構造を設計するモードに使用できます.
    クラス、オブジェクトの構成により、より大きな構造に容易に拡張できます.
    これにより、相互依存関係を持つクラス間の複雑な構造の開発が容易になり、メンテナンスが容易になります.Adapter Decorator Proxy Facade Composite Flyweight Bridge

    2.1. アダプタモード

  • アダプタは、通常、110ボルトから220ボルトまたは逆の変換器に変換される例である.
  • で互換性のない既存のクラスのインタフェースを変換して再利用します.
  • SOLIDでは開発閉鎖原則(OCP)に従う.
  • Electronic 110 Vインタフェース、およびこのインタフェースを実装するHairDryerクラス.
    Electronic 220 Vインタフェースとそれを実現するAirConditor、Cleanerクラスがあります.
  • 202 VのCleanerクラスでは110 Vオブジェクトをパラメータとするconnectメソッドは使用できません.
  • 202 Vオブジェクトでも110 Vオブジェクトメソッドを使用できるように、コンバータロールのアダプタクラスを作成します.
  • SocketAdaptor.java

    package com.company.designpattern.adaptor;
    
    public class SocketAdaptor implements Electronic110V {
    
        private Electronic220V electronic220V;
    
        public SocketAdaptor(Electronic220V electronic220V) {
            this.electronic220V = electronic220V;
        }
    
        @Override
        public void powerOn() {
            electronic220V.connect();
        }
    }

    Main.java

    package com.company.designpattern;
    
    import com.company.designpattern.adaptor.Cleaner;
    import com.company.designpattern.adaptor.Electronic110V;
    import com.company.designpattern.adaptor.HairDryer;
    import com.company.designpattern.adaptor.SocketAdaptor;
    
    public class Main {
    
        public static void main(String[] args) {
    
            HairDryer hairDryer = new HairDryer();
            connect(hairDryer);
    
            Cleaner cleaner = new Cleaner();
            Electronic110V adaptor = new SocketAdaptor(cleaner);
            connect(adaptor);
        }
    
        // 콘센트
        public static void connect(Electronic110V electronic110V) {
            electronic110V.powerOn();
        }
    }
    オブジェクトとタイプの異なるインタフェースのアダプタオブジェクトを実装することで、インタフェースのプロパティを使用して、自身のシェイプを変換する必要はありません.

    2.2. 装飾図案

  • アクセサリーパターンは、既存のスケルトンを維持できますが、後で必要に応じて使用できます.
  • 継承よりも柔軟な実装であり、拡張が必要であれば継承の代替案としてもよい.
  • SOLIDでは開発閉鎖原則(OCP)と依存逆転原則(DIP)に従う.
  • 例えば、アメニティにミルクを入れると、カフェラテ、カフェラテにモカシロップを入れると、カフェラテのコーヒー番組になると、デコレーション柄を使うことができます.
    ここで、アメニティは素子、ミルク、シロップはデコレーション.

    Coffee.java

    아메리카노 컴포넌트
    public abstract class Coffee {
    	public abstract void brewing();
    }

    Decorator.java

    public abstract class Decorator extends Coffee{
    
    	Coffee coffee;
    	public Decorator(Coffee coffee){
    		this.coffee = coffee;
    	}
    	
    	@Override
    	public void brewing() {
    		coffee.brewing();
    	}
    }

    Latte.java

    우유 데코레이터
    public class Latte extends Decorator{
    
    	public Latte(Coffee coffee) {
    		super(coffee);
    	}
      
    	public void brewing() {
    		super.brewing();
    		System.out.print("Adding Milk ");
    	}
    }

    Mocha.java

    시럽 데코레이터
    public class Mocha extends Decorator{
    
    	public Mocha(Coffee coffee) {
    		super(coffee);
    	}
    
    	public void brewing() {
    		super.brewing();
    		System.out.print("Adding Mocha Syrup ");
    	}
    }
  • データレコーダモードは、持続機能の追加または削除が容易である.
    新しいメニューがあれば、簡単に追加することもできます.
  • WhippedCream.java

    새로운 메뉴 추가 휘핑 크림 데코레이터
    public class WhippedCream extends Decorator{
    
    	public WhippedCream(Coffee coffee) {
    		super(coffee);
    	}
    
    	public void brewing() {
    		super.brewing();
    		System.out.print("Adding WhippedCream ");
    	}
    }

    2.3. プロキシモード

  • Proxyは代理人を意味し、代わりにいくつかのことを処理することを意味します.
  • は、Proxy Classを介して転送するように設計され、実際のクライアントはProxyから結果を得る.
  • SOLIDにおいて,開放閉鎖原則(OCP)と依存逆転原則(DIP)に従う.
  • 2

    Cacheの機能も利用できます。

    ネットワーク通信が結果を受け取った場合は、結果をそのまま置いてください.
    サーバ上のデータも頻繁に変更されない場合は、メモリにキャッシュし、同じリクエストを受信したときにダウングレードできます.
  • 2.3.1. プロキシモードを適用する前に


    Browserインタフェースはhtmlを表示する役割を果たし,チェーンCheromeBrowserが特定のurlをロードするhtmlオブジェクトを実現する.

    Browser.java

    package com.company.designpattern.proxy;
    
    public interface Browser {
        Html show();
    }

    ChromeBrowser.java

    package com.company.designpattern.proxy;
    
    public class ChromeBrowser implements Browser{
    
        private String url;
    
        public ChromeBrowser(String url) {
            this.url = url;
        }
    
        @Override
        public Html show() {
            System.out.println("ChromeBrowser loading html from : " + url);
            return new Html(url);
        }
    }
  • などのURLが入力されたオブジェクトですが、show()メソッドを呼び出すたびにロードされます.

  • ProxyBrowserを作成し、同じURLを複数回要求すると、受信した結果が返されます.

    2.3.2. プロキシモードを適用した後


    ProxyBrowser.java

    package com.company.designpattern.proxy;
    
    public class ProxyBrowser implements Browser{
    
        private String url;
        private Html html;
    
        public ProxyBrowser(String url) {
            this.url = url;
        }
    
        @Override
        public Html show() {
            if (html == null) {
                this.html = new Html(url);
                System.out.println("ProxyBrowser loading html from : " + url);
            } else {
                System.out.println("ProxyBrowser use cache html : " + url);
            }
            return html;
        }
    }

    2.4. 波長モード(Facade pattern)

  • Facadeとは建物の正面を指し、建物の正面しか見えず、後ろに何があるか分かりません.
  • 複数のオブジェクトと実際に使用されているサブオブジェクトとの間に複雑な依存関係がある場合、ここで提供されるインタフェース使用機能のみを利用してfacadeというオブジェクトを中間に配置する.
  • Facadeは、自分が持っている各レベルの機能を明確に理解する必要があります.
  • ファイル転送プロトコル(FTP)によるファイルの書き込みおよび読み出しの例
  • .

    FtpProtocol.java

    package com.company.design.facade;
    
    public class FtpProtocol {
    
        public FtpProtocol(String host, int port, String path){
            System.out.println("ftp server create");
        }
    
    
        public void connect(){
            System.out.println("ftp server connected");
        }
    
        public void moveDirectory(){
            System.out.println("move path");
        }
    
        public void disConnect(){
            System.out.println("ftp server disConnected");
        }
    }

    FileWriter.java

    package com.company.design.facade;
    
    public class FileWriter {
    
        public FileWriter(String fileName){
    
        }
    
        public void fileConnect(){
            System.out.println("FileWriter Connected");
        }
    
        public void fileWrite(String content){
            System.out.println("write : "+content);
        }
    
        public void fileDisconnect(){
            System.out.println("FileWriter disConnected");
        }
    }

    FileReader.java

    package com.company.design.facade;
    
    public class FileReader {
    
        public FileReader(String fileName){
    
        }
    
        public void fileConnect(){
            System.out.println("FileReader Connected");
        }
    
        public String fileRead(){
            return "content";
        }
    
        public void fileDisconnect(){
            System.out.println("FileReader disConnected");
        }
    }
    ファイルの書き込み、送信、読み取りを実行すると、次の手順に従います.
    1.FTPに接続してディレクトリを移動します.
    2.FileWriterに接続してファイルに書き込みます.
    3.FileReaderに接続してファイルを読み込みます.
    4.FTP、FileWriter、FileReaderとの接続を解除します.

    これらのクラスの構造間にすべての依存関係を含むFacadeオブジェクトを配置することで、複雑な構造を解決できます。


    SftpClient.java

    package com.company.design.facade;
    
    public class SftpClient {
    
        private FtpProtocol ftpProtocol;
        private FileReader fileReader;
        private FileWriter fileWriter;
    
        public SftpClient(String host, int port, String path, String fileName){
            this.ftpProtocol = new FtpProtocol(host, port, path);
            this.fileReader = new FileReader(fileName);
            this.fileWriter = new FileWriter(fileName);
        }
    
        public void connect(){
            this.ftpProtocol.connect();
            this.ftpProtocol.moveDirectory();
            this.fileReader.fileConnect();
            this.fileWriter.fileConnect();
    
        }
    
        public void write(String content){
            this.fileWriter.fileWrite(content);
        }
    
        public String read(){
            return this.fileReader.fileRead();
        }
    
        public void disConnect(){
            this.fileReader.fileDisconnect();
            this.fileWriter.fileDisconnect();
            this.ftpProtocol.disConnect();
        }
    
    }

    3.動作モード


    繰り返し使用するオブジェクトのインタラクションをモード化します.クラスまたはオブジェクトがどのように相互作用し、どのように分散するかの責任を提供します.
    動作モードは,動作関連モードを用いて独立して物事を処理する際に用いられる.Observer Strategy Template Method Interpreter Iterator Visitor Chain of responsibility Command Mediator State Memento

    3.1. ファイバモード

  • オブザーバモードは、変化が発生した場合に、他の予め登録されたクラスに通知するモードを実現する.
  • 特定のイベントについて、リスナーを介して伝達されるイベントリスナーがこのモードを使用している.
  • ボタンを押してクリックイベントをトリガーする例
    傍観者モードには、ボタンをクリックするイベントが発生した場合に、リスナーを介してイベントが渡されます.
  • MyButton.java

    package com.company.design.observer;
    
    public class MyButton {
        private String name;
        private IButtonClickListener buttonClickListener;
    
        public MyButton(String buttonName){
            this.name = buttonName;
        }
    
        public void click(String clickEvent){
            buttonClickListener.clickEvent(this.name+", "+clickEvent);
        }
    
        public void addListener(IButtonClickListener buttonClickListener){
            this.buttonClickListener = buttonClickListener;
        }
    }

    IButtonClickListener.java

    package com.company.design.observer;
    
    public interface IButtonClickListener {
        void clickEvent(String event);
    }

    Main.java

    public class Main {
    
        public static void main(String[] args) {
            Button button = new Button("버튼");
            button.addListener(new IButtonListener(){
               @Override
               public void clickEvent(String event) {
                   System.out.println(event);
               }
            });
    
            button.click("메시지 전달: click 1");
            button.click("메시지 전달: click 2");
            button.click("메시지 전달: click 3");
            button.click("메시지 전달: click 4");
        }
    }

    3.2. 戦略モデル

  • 戦略モデルと呼ばれ、対象向けの花です.
  • は、類似の動作をカプセル化し、オブジェクトの動作を変更したい場合は直接変更せず、ポリシーのみを変更して柔軟に拡張するモードである.
  • SOLIDにおいて,開放閉鎖原則(OCP)と依存逆転原則(DIP)に従う.
  • 戦略手法を有する戦略対象(Normal Strategy,Base 64 Strategy)
    ポリシーオブジェクトを使用するコンテキスト(Encoder)
    ポリシー・オブジェクトを作成し、コンテキストに注入するクライアント.