구체 적 인 디자인 모델 (2): 구조 형 모델

44793 단어 디자인 모드
구조 모드:
7 가지 가 있 습 니 다. 어댑터 모드, 장식 기 모드, 대리 모드, 외관 모드, 브리지 모드, 조합 모드, 향원 모드 입 니 다.
6. 어댑터 모드 (Adapter): 간단 한 설명: 하나의 인 터 페 이 스 를 고객 이 원 하 는 다른 인터페이스 로 전환 합 니 다. 이 모델 은 인터페이스 가 호 환 되 지 않 아 함께 일 할 수 없 었 던 유형 들 을 함께 일 할 수 있 게 합 니 다.
어댑터 모드 는 세분 화 에 따라 3 가지 로 나 눌 수 있 습 니 다.
클래스 어댑터 모드
대상 의 어댑터 모드
인터페이스 어댑터 모드
예 를 들 어 설명: 1. 클래스 어댑터 모드
package adapter;

public class Source {
    //     
    public void method1(){
        System.out.println("this is source method1");
    }
}
package adapter;

public interface Targetable {

    //        

    // Source       
    public void method1();

    //      
    public void method2();
}
package adapter;

/**
 *                             ,                       
 *       :       、        、        
 * @author cx
 *
 *    :       (Source   +Adapter  +Targetable    +Test   )
 */


 /**
  *                 :
  *        :                     ,           ,
                          ,      ,        。

            :                       ,      Wrapper ,
                         , Wrapper     ,         。

            :                 ,         Wrapper,      ,
                         ,       。
  * @author cx
  *
  */
public class Adapter extends Source implements Targetable{

    public void method2() {
        // TODO          
        System.out.println("this is the targetable method");
    }

}
package adapter;

public class Test {
    public static void main(String[] args) {
        Targetable targetable=new Adapter();

        //  Targetable           Source     
        targetable.method1();
        targetable.method2();
    }
}

테스트 결과: 대상 인터페이스 에 소스 클래스 를 맞 추 는 방법
this is source method1
this is the targetable method

2. 대상 의 어댑터 모드: 하나의 의뢰 클래스 (Wrapper 로 Source 를 계승 하 는 Adapter 클래스 를 대체) 로 클래스 와 클래스 간 의 결합 을 낮 추고 의존 하 는 방식 을 사용 합 니 다.
package adapter;

public class Source {
    //     
    public void method1(){
        System.out.println("this is source method1");
    }
}
package adapter;

public interface Targetable {

    //        

    // Source       
    public void method1();

    //      
    public void method2();
}
package adapter;

/**
 *         
 *    Adapter    ,   Source ,    Source    
 * @author cx
 *
 */
public class Wrapper implements Targetable{

    private Source source;

    //Wrapper      ,   Source    ,   Source    
    public Wrapper(Source source) {
        super();
        this.source=source;
    }
    @Override
    public void method1() {
        source.method1();    //  source    ,          ,          (        )

    }

    @Override
    public void method2() {
        System.out.println("this is the targetable method!");

    }

}
package adapter;

public class WrapperTest {
    public static void main(String[] args) {
        Source source=new Source();

        Targetable targetable=new Wrapper(source);

        //Targetable         Source     (     )
        targetable.method1();
        targetable.method2();

    }
}

테스트 결과
this is source method1
this is the targetable method!

3. 인터페이스의 어댑터 모드:
package adapter;

/**
 *         :        ;
 *                        ,          ,            
 *      ,         ,                 ,       。
 *             ,          ,        ,             ,  
 *              ,        ,      ,           
 * @author cx
 *
 */

public interface Sourceable {

    public void method1();

    public void method2();
}
package adapter;

public class SourceSub1 extends Wrapper2{

    //       ,             (  method1())
    @Override
    public void method1() {
        System.out.println("the sourceable interface is first sub1!");
    }
}
package adapter;

public class SourceSub2 extends Wrapper2{

    //       ,             (  method2())
    @Override
    public void method2() {
        System.out.println("the sourceable interface is second sub2!");
    }
}
package adapter;

/**
 *    :        ,                ,         
 *          ,          
 * @author cx
 *
 */
public abstract class Wrapper2 implements Sourceable{

    @Override
    public void method1() {
        // TODO          

    }

    @Override
    public void method2() {
        // TODO          

    }
}
package adapter;

public class WrapperTest2 {
    public static void main(String[] args) {
        Sourceable source1=new SourceSub1();

        Sourceable source2=new SourceSub2();

        source1.method1();
        source1.method2();

        source2.method1();
        source2.method2();
    }
}

테스트 결과
the sourceable interface is first sub1!
the sourceable interface is second sub2!

7. 장식 기 모드 (장식 기)
간단 한 설명: 동태 적 으로 한 대상 에 게 추가 적 인 직책 을 추가 하고 기능 을 추가 하 는 데 있어 장식 기 모델 은 하위 클래스 를 생 성 하 는 것 보다 더욱 유연 하 다.
예 를 들 어 설명:
package decorator;

public interface Sourceable {

    public void method();
}
package decorator;

/**
 * Source       
 * @author cx
 *
 */
public class Source implements Sourceable{

    @Override
    public void method() {
        // TODO          
        System.out.println("the original method!");
    }

}
package decorator;

/**
 *     :               ,      ,       
 *                       ,              
 * 
 *          :
 *      1.          
 *      2.            ,        (         ,      。)
 * 
 *   :         ,    ,           ,     
 * @author cx
 *
 */
public class Decorator implements Sourceable{

    private Sourceable sourceable;

    public Decorator(Sourceable sourceable) {
        super();
        this.sourceable=sourceable;
    }

    @Override
    public void method() {

        //    Source.method()            ,   ,  Source.method(),        
        System.out.println("before decorator!");

        sourceable.method();   //    

        System.out.println("after decorator!");

    }



}
package decorator;

public class Test {

    public static void main(String[] args) {

        Sourceable obj=new Decorator(new Source());  //obj.method()  --         

        obj.method();
    }
}

테스트 결과
before decorator!
the original method!
after decorator!

8. 프 록 시 모드 (프 록 시)
간단 한 설명: 다른 대상 에 게 이 대상 에 대한 접근 을 제어 하기 위해 에이 전 트 를 제공 합 니 다. 하 나 는 다른 종류의 기능 을 대표 합 니 다.
예 를 들 어 설명:
package proxy;

public interface Sourceable {

    public void method();
}
package proxy;

public class Source implements Sourceable{

    @Override
    public void method() {
        // TODO          
        System.out.println("the original method!");
    }

}
package proxy;

/**
 *     (Proxy)
 *               ,          ,      ,     ,      
 *          ,            Source     .
 * 
 *     :

       ,             ,           。
             ,                ,          webservice          ,
                ,         。
                          ,          ,             ,
                      ,                               。
                       ,         。
 * 
 * @author cx
 *
 *  :

    1)                     ,               。
    2)                       ,               。
                                 

 *    :
 *                      ,                         。
                 ,             。
 */



public class Proxy implements Sourceable{

    private Source source;

    public Proxy() {
        super();  //         
        this.source=new Source();
        //           :                Sourceable  (    )
        //          ,      Source  ,               (    )
    }

    @Override
    public void method() { 

        //        method()  
        before();
        source.method();
        after();
    }

    private void before(){
        //           (           )
        System.out.println("before proxy!"); 
    }

    private void after(){
        System.out.println("after proxy!");
    }
}
package proxy;

public class Test {
    public static void main(String[] args) {

        //          ,       ,       
        Sourceable sourceable=new Proxy();

        sourceable.method();
    }
}

테스트 결과
before proxy!
the original method!
after proxy!

9. 외관 모드 (Facade)
간단 한 설명: 시스템 의 복잡성 을 숨 기 고 클 라 이언 트 에 게 시스템 에 접근 할 수 있 는 인 터 페 이 스 를 제공 합 니 다.
의도: 서브 시스템 의 인터페이스 에 일치 하 는 인 터 페 이 스 를 제공 합 니 다. 외관 모델 은 고 층 인 터 페 이 스 를 정의 합 니 다. 이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.
예 를 들 어 설명:
package facade;

public interface Sourceable {

    //  
    public void startup();
    //  
    public void shutdown();
}
package facade;

public class CPU implements Sourceable{

    @Override
    public void startup() {
        // TODO          
        System.out.println("cpu startup!");
    }

    @Override
    public void shutdown() {
        // TODO          
        System.out.println("cpu shutdown!");
    }


}
package facade;

public class Memory implements Sourceable{

    @Override
    public void startup() {
        // TODO          
        System.out.println("memory startup!");
    }

    @Override
    public void shutdown() {
        // TODO          
        System.out.println("memory shutdown!");
    }


}
package facade;

public class Disk implements Sourceable{

    @Override
    public void startup() {
        // TODO          
        System.out.println("disk startup!");
    }

    @Override
    public void shutdown() {
        // TODO          
        System.out.println("disk shutdown!");
    }


}
package facade;

/**
 *     :               , spring  ,                   
 *                            Facade(    ),            。
 *         
 * @author cx
 *
 *     Computer ,  ,CPU、Memory、Disk             ,    ,          
 *       ,           ,          ,  Computer ,          Computer  ,
 *             ,       !
 */


public class Computer {

    private CPU cpu;

    private Memory memory;

    private Disk disk;

    public Computer() {
        cpu=new CPU();
        memory=new Memory();
        disk=new Disk();
    }

    public void startup(){
        System.out.println("start the computer!");
        cpu.startup();
        memory.startup();
        disk.startup();
        System.out.println("start the computer finished!");
    }

    public void shutdown(){
        System.out.println("shutdown the computer!");
        cpu.shutdown();
        memory.shutdown();
        disk.shutdown();
        System.out.println("shutdown the computer finished!");
    }
}
package facade;

public class User {
    public static void main(String[] args) {
        Computer computer=new Computer();

        computer.startup();

        computer.shutdown();
    }
}

테스트 결과
start the computer!
cpu startup!
memory startup!
disk startup!
start the computer finished!
shutdown the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
shutdown the computer finished!

10. 브리지 모드 (Bridge)
간단 한 설명: 추상 화 와 결합 을 실현 하여 이들 이 독립 적 으로 변화 할 수 있 도록 하 는 데 사용 된다.
의도: 추상 적 인 부분 과 실현 부분 을 분리 하여 독립 적 으로 변화 시 킬 수 있 도록 한다.
예 를 들 어 펜 과 색깔 분리 (서로 다른 크기 의 펜, 서로 다른 색깔 (브리지) 로 함께 있 고 서로 다른 것 을 그린다), 추상 과 분 리 를 실현 한다!
펜 의 인터페이스:
package bridge;

public abstract class Pen {
    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw(String name);
}

색 인터페이스:
package bridge;

public interface Color {

    public void bePaint(String penType,String name);
}

대형 펜:
package bridge;

public class BigPen extends Pen{

    @Override
    public void draw(String name) {
        // TODO          
        String penType="      ";
        this.color.bePaint(penType, name);
    }

}

중형 펜:
package bridge;

public class MiddlePen extends Pen{

    @Override
    public void draw(String name) {
        // TODO          
        String penType="     ";
        this.color.bePaint(penType, name);
    }

}

소형 펜:
package bridge;

public class SmallPen extends Pen{

    @Override
    public void draw(String name) {
        // TODO          
        String penType="     ";
        this.color.bePaint(penType, name);
    }

}

검은색:
package bridge;

public class BlackColor implements Color{

    @Override
    public void bePaint(String penType, String name) {
        // TODO          
        System.out.println(penType+"   "+name+".");
    }

}

파란색:
package bridge;

public class BuleColor implements Color{

    @Override
    public void bePaint(String penType, String name) {
        // TODO          
        System.out.println(penType+"   "+name+".");
    }

}

클 라 이언 트 테스트:
package bridge;

public class Client {

    public static void main(String[] args) {
        Color color;
        Pen pen;
        color=new BuleColor(); //  
        pen=new BigPen();   //    
        pen.setColor(color);
        //new BigPen().setColor(new BuleColor()).draw("  ");//        
        pen.draw("  ");   //          
    }
}

테스트 결과
           .

11. 조합 모드 (Composite)
간단 한 설명: 대상 을 트 리 구조 로 조합 하여 '부분 - 전체' 차원 구 조 를 나타 내 고 조합 모델 은 사용자 가 하나의 대상 과 조합 대상 에 대한 사용 이 일치 하도록 한다.
예 를 들 어 나무 구조 로 설명 하 다.
(TreeNode) 나무의 하위 노드 클래스:
package composite;

import java.awt.List;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;

public class TreeNode {

    private String name;
    private TreeNode parent;
    private Vector children=new Vector<>();

    public TreeNode(String name) {
        this.name=name;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public TreeNode getParent() {
        return parent;
    }
    public void setParent(TreeNode parent) {
        this.parent = parent;
    }

    //      
    public void add(TreeNode node){
        children.add(node);
    }

    //      
    public void remove(TreeNode node){
        children.remove(node);
    }

    //      
    public Enumeration getChildren(){
        return children.elements();
    }
}

(Tree) 나무 류 는 나무의 하위 노드 와 일부 전체적인 관계 이다. 왜냐하면 나 무 는 일련의 나무의 결점 으로 구성 되 기 때문이다.
package composite;

/**
 *     :          -                     
 *     :  >  >  >  
 *     :              ,          ,     ,  
 * @author cx
 *
 */
public class Tree {
    TreeNode root=null;

    public Tree(String name) {
        //    : Tree TreeNode      ,  Tree (   ) ,TreeNode(     )
        //   (TreeNode)        (Tree)          
        root=new TreeNode(name);
    }

    public static void main(String[] args) {
        Tree tree=new Tree("A");
        TreeNode nodeB=new TreeNode("B");
        TreeNode nodeC=new TreeNode("C");
        nodeB.add(nodeC);
        tree.root.add(nodeB);
        System.out.println("build the tree finished!");
    }
}

테스트 결과
build the tree finished!

12. 향원 모드 (FlyWeight)
간단 한 설명: 주로 생 성 대상 을 줄 이 고 메모리 의 점용 을 줄 이 며 성능 을 향상 시 키 는 데 사용 되 며 하나의 풀 개념 이 있 으 며 공유 기술 을 활용 하여 대량의 입자 도 대상 을 효과적으로 지원 합 니 다.
예 를 들 어 설명: 데이터베이스 연결 탱크 를 예 로 들 면 (라인 탱크 도 이 모델 을 사용한다).
데이터베이스 연결 탱크 의 첫 번 째 실현 (Vector 류 나 ArrayList 로 데이터베이스 연결 탱크 를 저장) 은 데이터베이스 연결 탱크 의 장점 중 하 나 는 매번 새로 연결 하지 않 고 바로 연결 탱크 에 가서 찾 으 면 된다 는 것 이다.
package flyweight;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 *         ,           ,            
 *              ,        
 * @author cx
 *
 */

public class ConnectionPool {

    private Vector pool;

    private String url="jdbc:mysql://localhost:3306/test";
    private String username="root";
    private String password = "root";  
    private String driverClassName = "com.mysql.jdbc.Driver"; 

    private int poolSize=100;

    private static ConnectionPool instance=null;
    Connection conn=null;



    //    ,         
    private ConnectionPool(){
        pool=new Vector(poolSize);

        for(int i=0;itry {  
                    Class.forName(driverClassName);  
                    conn = DriverManager.getConnection(url, username, password);  
                    pool.add(conn);   //          
                } catch (ClassNotFoundException e) {  
                    e.printStackTrace();  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
        }
    }


    public synchronized void closeConnection(){
        //     ,        ,              
        pool.add(conn);
    }


    //              
    public synchronized Connection getConnection(){

        if(pool.size()>0){
            Connection connection=pool.get(0);
            pool.remove(connection);
            return connection;
        }else{
            return null;
        }
    }

}

데이터베이스 연결 탱크 의 두 번 째 실현 (HashMap 으로 키 값 쌍 을 저장 하고 키 에 표지 위 치 를 놓 습 니 다)
package flyweight;

import java.security.KeyStore.Entry;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class ConnectionPool2 {

    private Map connectionPool=null;

    private String url="jdbc:mysql://localhost:3306/test";
    private String username="root";
    private String password = "root";  
    private String driverClassName = "com.mysql.jdbc.Driver"; 

    private int poolSize=100;

    private static ConnectionPool instance=null;
    Connection conn=null;

    private void initPool(){
        connectionPool =new HashMap<>();
        try {
            Class.forName(driverClassName);
            Connection connection=DriverManager.getConnection(url);
            for(int i=0;i"AVAILABLE");  //         ,         
            }
        } catch (ClassNotFoundException | SQLException e) {
            // TODO       catch  
            e.printStackTrace();
        }

    }

    public Connection getConnection() throws ClassNotFoundException, SQLException{
        boolean isConnectionAvailable=true;
        for(java.util.Map.Entry entry:connectionPool.entrySet()){
            synchronized (entry) {
                if(entry.getValue()=="AVAILABLE"){
                    entry.setValue("NOTAVAILABLE");
                    return entry.getKey();
                }
                isConnectionAvailable=false;
            }
        }

        if(!isConnectionAvailable){
            Class.forName(driverClassName);
            conn=DriverManager.getConnection(url);
            connectionPool.put(conn, "NOTAVAILABLE");
            return conn;
        }

        return null;
    }

    public void closeConnection(Connection connection){
        for(java.util.Map.Entry entry:connectionPool.entrySet()){
            if(entry.getKey().equals(connection)){
                entry.setValue("AVAILABLE");
            }
        }
    }
}

좋은 웹페이지 즐겨찾기