[Ava]設計モード-作成、構造、動作モード
デザインモード
常用設計モードを定型化することで,タイプ別に最適な方法で開発する.
Gofデザインモード
オブジェクト向けのコンセプトに基づいて,設計で再利用する際に有用な設計を設計モードに整理する.
Gofデザインモデルをよく理解し運用できれば、良いソフトウェアデザインができます.
長所
短所
1.アレイの作成
オブジェクトの作成に関連するモードでは、オブジェクトの作成と変更がシステム全体に及ぼす影響を最小限に抑え、コードの柔軟性を向上させることができます.
Singleton
Factory Method
Prototype
Builder
Abstart Factory
Chaining
1.1. モノトーンモード
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;
}
}
2.構造パターン
プログラム内の資料構造やインタフェース構造などのプログラム構造を設計するモードに使用できます.
クラス、オブジェクトの構成により、より大きな構造に容易に拡張できます.
これにより、相互依存関係を持つクラス間の複雑な構造の開発が容易になり、メンテナンスが容易になります.
Adapter
Decorator
Proxy
Facade
Composite
Flyweight
Bridge
2.1. アダプタモード
Electronic 220 Vインタフェースとそれを実現するAirConditor、Cleanerクラスがあります.
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. 装飾図案
ここで、アメニティは素子、ミルク、シロップはデコレーション.
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. プロキシモード
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);
}
}
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)
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. 戦略モデル
ポリシーオブジェクトを使用するコンテキスト(Encoder)
ポリシー・オブジェクトを作成し、コンテキストに注入するクライアント.
Reference
この問題について([Ava]設計モード-作成、構造、動作モード), 我々は、より多くの情報をここで見つけました https://velog.io/@heewonim/Java-디자인-패턴-생성-구조-행위-패턴テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol