成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java學(xué)習(xí) - 設(shè)計(jì)模式

MorePainMoreGain / 1051人閱讀

摘要:舉例遇到多個(gè)構(gòu)造器參數(shù)時(shí)考慮使用構(gòu)建器,而不是重疊構(gòu)造器模式或模式調(diào)用方法。靜態(tài)工廠和構(gòu)造器有個(gè)共同的局限性它們不能很好地?cái)U(kuò)展大量的可選參數(shù)構(gòu)建器模式年月日客戶端調(diào)用缺點(diǎn)構(gòu)建器模式可能比重疊構(gòu)造器更加冗長(zhǎng),參數(shù)多時(shí)使用較好。

設(shè)計(jì)模式

此文章部分來(lái)于網(wǎng)絡(luò),為了學(xué)習(xí)總結(jié)。

一、原型模式(Prototype)

介紹:從一個(gè)對(duì)象再創(chuàng)建另一個(gè)對(duì)象,而不需知道任何細(xì)節(jié)。

1、兩種表現(xiàn)形式

(1)簡(jiǎn)單形式

(2)登記形式

這兩種表現(xiàn)形式僅僅是原型模式的不同實(shí)現(xiàn)。

2、倆種克隆方法

(1)淺復(fù)制

介紹:只克隆值傳遞的數(shù)據(jù)(比如基本數(shù)據(jù)類(lèi)型、String),而不復(fù)制它所引用的對(duì)象,就是對(duì)其他對(duì)象的引用都指向原來(lái)的對(duì)象。

注意:可實(shí)現(xiàn)Cloneable接口。

(2)深復(fù)制

介紹:除了淺度克隆要克隆的值外,還負(fù)責(zé)克隆引用類(lèi)型的數(shù)據(jù),把要復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。

注意:采用字節(jié)流寫(xiě)入寫(xiě)出對(duì)象,所有對(duì)象必須實(shí)現(xiàn)Serializable。Thread和Socket對(duì)象必須設(shè)置transient,不予復(fù)制。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Prototype implements Cloneable, Serializable{
    
    @Override
    protected Object clone() throws CloneNotSupportedException { //淺克隆
        // TODO Auto-generated method stub
        Prototype prototype = (Prototype) super.clone();
        return prototype;
    }
    
    public Object deepClone(){ //深克隆
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }
    
}
二、模板方法模式

介紹:將重復(fù)的部分上升到父類(lèi)。

舉例:公司的面試題是相同的,只有應(yīng)聘者的答案不同,所以相同的問(wèn)題在父類(lèi)中表現(xiàn),子類(lèi)只用作記錄答案。

public class TestPaper {
    
    public void testQuestion1(){
        System.out.println("1 + 1 = ");
        System.out.println("答案是:" + answer());
    }
    
    protected String answer(){
        return "";
    }

}
public class TestPaperA extends TestPaper {
    
    @Override
    protected String answer() {
        // TODO Auto-generated method stub
        return "2";
    }

}
public class Client {
    
    public static void main(String[] args) {
        TestPaper testPagerA = new TestPaperA();
        testPagerA.question();        
    }
    
}
三、外觀模式(Fade)

介紹:定義一個(gè)高層接口,使得子系統(tǒng)更容易使用。

四、建造者模式(Builder)

介紹:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。

舉例:遇到多個(gè)構(gòu)造器參數(shù)時(shí)考慮使用構(gòu)建器,而不是重疊構(gòu)造器模式或JavaBean模式調(diào)用setter方法。(靜態(tài)工廠和構(gòu)造器有個(gè)共同的局限性:它們不能很好地?cái)U(kuò)展大量的可選參數(shù))

/**
 * 構(gòu)建器模式
 * @author alex
 * @date 2017年4月6日
 */
public class A {
    
    private final int a;
    private final int b;
    private final int c;
    
    public static class A_son {
        private final int a;
        private final int b;
        private int c = 0;
        
        public A_son(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public A_son c(int val) { 
            c = val;
            return this;
        }
        
        public A build() {
            return new A(this);
        }
        
    }

    public A(A_son a_son) {
        a = a_son.a;
        b = a_son.b;
        c = a_son.c;
    }
    
}
A a = new A.A_son(12, 12).c(12).build(); //客戶端調(diào)用

缺點(diǎn):構(gòu)建器模式可能比重疊構(gòu)造器更加冗長(zhǎng),參數(shù)多時(shí)使用較好。如果構(gòu)建器沒(méi)有在最初使用,后期使用會(huì)有些難以控制,通常一開(kāi)始就使用構(gòu)建器。

優(yōu)點(diǎn):構(gòu)建器比重疊構(gòu)造器的客戶端代碼易讀寫(xiě)。比JavaBean更安全。

五、觀察者模式 六、工廠方法模式

舉例:項(xiàng)目中可能需要訪問(wèn)多種類(lèi)型的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)訪問(wèn)與邏輯業(yè)務(wù)應(yīng)該獨(dú)立分開(kāi),只需在客戶端創(chuàng)建工廠類(lèi)。

七、抽象工廠模式

八、狀態(tài)模式

介紹:將對(duì)象轉(zhuǎn)換的邏輯判斷轉(zhuǎn)移到不同狀態(tài)的類(lèi)中,來(lái)簡(jiǎn)化復(fù)雜的邏輯判斷。如果邏輯判斷很簡(jiǎn)單就不需要用此模式了。

abstract class State {
    
    public abstract void handle(Context context);

}

public class Context {
    
    private State state;

    public Context(State state) {
        this.state = state;
    }
    
    public void request() {
        state.handle(this);
    }

    public State getState() {
        System.out.println("當(dāng)前狀態(tài): " + state.getClass().toString());
        return state;
    }

    public void setState(State state) {
        this.state = state;
        getState();
    }
    
}

public class ConcreteStateA extends State {

    @Override
    public void handle(Context context) {
        // TODO Auto-generated method stub
        context.setState(new ConcreteStateB()); // 創(chuàng)建下一個(gè)邏輯判斷
    }

}
public class ConcreteStateB extends State {

    @Override
    public void handle(Context context) {
        // TODO Auto-generated method stub
        context.setState(new ConcreteStateA());
    }

}

public class Test {
    
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.request();
        context.request();
        context.request();
    }

}
九、適配器模式

介紹:系統(tǒng)的數(shù)據(jù)和行為都正確,但接口不符時(shí),使得一個(gè)原有對(duì)象與某個(gè)接口匹配。

舉例:假如巴西隊(duì)中有中國(guó)球員,防止語(yǔ)言間的差異,中國(guó)球員需要翻譯來(lái)與團(tuán)隊(duì)交流。

十、備忘錄模式

介紹:捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。之后可恢復(fù)之前的狀態(tài)。

public class Originator {
    
    private String state;
    
    public Memento createMemento() {
        return new Memento(state);
    }
    
    public void setMemento(Memento memento) {
        state = memento.getState();
    }
    
    public void show() {
        System.out.println("state =" + state);
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    
}

public class Caretaker {
    
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
    
}

public class Memento {
    
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    
}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Originator originator = new Originator();
        originator.setState("on");
        originator.show();
        
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.createMemento());
        
        originator.setState("asdasd");
        originator.show();
        
        originator.setMemento(caretaker.getMemento());
        originator.show();
    }

}

缺點(diǎn):易消耗內(nèi)存。

十一、組合模式

介紹:將對(duì)象組合成樹(shù)形結(jié)構(gòu)來(lái)表示部分-整體,使部分與整體具有一致性。

public abstract class Component {

    protected String name;

    public Component(String name) {
        this.name = name;
    }
    
    public abstract void add(Component c);
    public abstract void remove(Component c);
    public abstract void display(int depth);
    
}

import org.apache.commons.lang.StringUtils;

public class Leaf extends Component {

    public Leaf(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void add(Component c) {
        // TODO Auto-generated method stub
        System.out.println("Don"t add component");
    }

    @Override
    public void remove(Component c) {
        // TODO Auto-generated method stub
        System.out.println("Don"t remove component");
    }

    @Override
    public void display(int depth) {
        // TODO Auto-generated method stub
        System.out.println(StringUtils.repeat("-", depth) + name);
    }

}

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

public class Composite extends Component {
    
    private List list = new ArrayList();

    public Composite(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void add(Component c) {
        // TODO Auto-generated method stub
        list.add(c);
    }

    @Override
    public void remove(Component c) {
        // TODO Auto-generated method stub
        list.remove(c);
    }

    @Override
    public void display(int depth) {
        // TODO Auto-generated method stub
        System.out.println(StringUtils.repeat("-", depth) + name);
        for (Component component : list) {
            component.display(depth + 2);
        }
    }

}

public class Test {
    
    public static void main(String[] args) {
        Composite root = new Composite("root");
        
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));
        
        Composite comp = new Composite("Composite X");
        comp.add(new Leaf("Leaf XA"));
        comp.add(new Leaf("Leaf XB"));
        
        root.add(comp);
        
        Composite comp2 = new Composite("Composite Y");
        root .add(comp2);
        
        root.display(1);
    }

}
十二、迭代器模式

介紹:提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示

/**
 * 迭代器抽象
 * @author chenguyan
 * @date 2017年6月16日
 */
public abstract class Iterator {
    
    public abstract Object first();
    public abstract Object next();
    public abstract boolean isDone();
    public abstract Object currentItem();

}

/**
 * 聚集抽象
 * @author chenguyan
 * @date 2017年6月16日
 */
public abstract class Aggregate {

    public abstract Iterator createIterator();

}

/**
 * 具體聚集
 * @author chenguyan
 * @date 2017年6月16日
 */
public class ConcreteAggregate extends Aggregate {

    private List items = new ArrayList();
    
    @Override
    public Iterator createIterator() {
        // TODO Auto-generated method stub
        return new ConcreteIterator(this);
    }
    
    public int count() {
        return items.size();
    }
    
    public Object get(int index) {
        return items.get(index);
    }
    
    public void add(Object obj) {
        items.add(obj);
    }

}

/**
 * 具體迭代器
 * @author chenguyan
 * @date 2017年6月16日
 */
public class ConcreteIterator extends Iterator {
    
    private ConcreteAggregate concreteAggregate;
    private int current = 0;
    
    public ConcreteIterator(ConcreteAggregate concrete) {
        // TODO Auto-generated constructor stub
        this.concreteAggregate = concrete;
    }

    @Override
    public Object first() {
        // TODO Auto-generated method stub
        return concreteAggregate.get(0);
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        current++;
        if (current >= concreteAggregate.count()) {
            return null;
        }
        return concreteAggregate.get(current);
    }

    @Override
    public boolean isDone() {
        // TODO Auto-generated method stub
        return current > concreteAggregate.count() ? true : false;
    }

    @Override
    public Object currentItem() {
        // TODO Auto-generated method stub
        return concreteAggregate.get(current);
    }

}

/**
 * 客戶端
 * @author chenguyan
 * @date 2017年6月16日
 */
public class Client {
    
    public static void main(String[] args) {
        ConcreteAggregate concrete = new ConcreteAggregate();
        concrete.add("a");
        concrete.add("b");
        concrete.add("c");
        concrete.add("d");
        concrete.add("e");
        
        Iterator ite = new ConcreteIterator(concrete);
        
        System.out.println(ite.first().toString());
        
        while (!ite.isDone()) {
            Object item = ite.next();
            System.out.println(item != null ? item.toString() : "");
        }
    }

}

為什么會(huì)采用抽象類(lèi)的方式來(lái)實(shí)現(xiàn)迭代器呢?因?yàn)榭梢杂胁煌牡樞颍瑥那跋蚝?、從后向前等,所以隨意新增迭代器的實(shí)現(xiàn)類(lèi)來(lái)達(dá)到迭代順序的不同,而且客戶端修改部分較少。

十三、單例模式

介紹:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。

/**
 * 雙重鎖定
 * @date 2017年7月3日
 */
public class Singleton {
    
    private static Singleton singleton;
    private static Object syncObj = new Object();
    
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (syncObj) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}
十四、橋接模式

介紹:按各自的功能進(jìn)行分類(lèi),使他們可以獨(dú)立運(yùn)行。

舉例:手機(jī)的品牌與軟件都會(huì)存在不兼容的情況,這是因?yàn)槭謾C(jī)廠商即做硬件又做軟件,沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。如果有一個(gè)統(tǒng)一的硬件廠商設(shè)計(jì)標(biāo)準(zhǔn),手機(jī)廠商只負(fù)責(zé)軟件,這樣每個(gè)手機(jī)廠商開(kāi)發(fā)的軟件就不存在不兼容的情況了。

十五、命令模式

介紹:將請(qǐng)求命令封裝成對(duì)象,從而使你可用不同的請(qǐng)求命令來(lái)操作對(duì)象。

/**
 * 命令
 * @date 2017年8月11日
 */
public abstract class Command {
    
    private Recipient recipient;

    public void setRecipient(Recipient recipient) {
        this.recipient = recipient;
    }
    
    public abstract void doing();

}

/**
 * 烤菜命令
 * @date 2017年8月11日
 */
public class RoastVegetablesCommand extends Command {

    private Recipient recipient;
    
    @Override
    public void setRecipient(Recipient recipient) {
        // TODO Auto-generated method stub
        this.recipient = recipient;
    }
    
    @Override
    public void doing() {
        // TODO Auto-generated method stub
        System.out.println("正在烤菜");
    }
    
}

/**
 * 烤肉命令
 * @date 2017年8月11日
 */
public class RoastMeatCommand extends Command {
    
    private Recipient recipient;
    
    @Override
    public void setRecipient(Recipient recipient) {
        // TODO Auto-generated method stub
        this.recipient = recipient;
    }

    @Override
    public void doing() {
        // TODO Auto-generated method stub
        System.out.println("正在執(zhí)行烤肉");
    }

}

/**
 * 接收人
 * @date 2017年8月11日
 */
public class Recipient {
    
    private String name;
    private String job;
    
    public Recipient(String name, String job) {
        this.name = name;
        this.job = job;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    
}

/**
 * 服務(wù)員
 * @date 2017年8月11日
 */
public class Waiter {
    
    private List commandList = new ArrayList();
    
    public void addOrder(Command command) {
        if (!commandList.contains(command)) {
            commandList.add(command);
        }
    }
    
    public void notifyCommand() {
        for (Command command : commandList) {
            command.doing();
        }
    }

}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Recipient recipient = new Recipient("大廚", "大廚");
        
        Command roastMeatCommand = new RoastMeatCommand();
        Command roastVegetablesCommand = new RoastVegetablesCommand();
        
        roastMeatCommand.setRecipient(recipient);
        roastVegetablesCommand.setRecipient(recipient);
        
        Waiter waiter = new Waiter();
        waiter.addOrder(roastMeatCommand);
        waiter.addOrder(roastVegetablesCommand);
        waiter.notifyCommand();
    }

}
設(shè)計(jì)原則 一、迪米特法則

介紹:如果兩個(gè)類(lèi)不必彼此通信,那么這兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用。強(qiáng)調(diào)類(lèi)之間的松耦合。

反射機(jī)制 一、調(diào)用私有域和方法(setAccessible)
class Employee{

    private int id;
    private String name;
    private int age;
    
    public Employee(){}
    
    public Employee(int id, String name, int age){
        this.id = id;
        this.name = name;
        this.age = age;
    }

    private void setId(int id){
       this.id = id;
    }
    
    private int judge(int id){
        return this.id - id;
    }
    
    private String sayHalo(String name){
        return "Halo" + name;
    }
    
}
public class PrivateTest{

     public static void main(String[] args){
         Employee em = new Employee(1, "Alex", 22);

         Class emClass =  em.getClass();
 
         Method judgeMethod = emClass.getDeclaredMethod("judge", new Class[]{Integer.TYPE}); //獲取聲明的方法
         judgeMethod.setAccessible(true); //使成員可以訪問(wèn)
 
         Method[] allMethods = emClass.getDeclaredMethods(); //獲取所有聲明的方法
         AccessibleObject.setAccessible(allMethods, true);
        
         judgeMethod.invoke(em, new Object[]{3}); //通過(guò)反射訪問(wèn)
 
         //or...
         for(Method method : allMethods){
          ...
         }
     }
     
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66917.html

相關(guān)文章

  • 學(xué)習(xí)Java必讀的10本書(shū)籍

    摘要:學(xué)習(xí)編程的本最佳書(shū)籍這些書(shū)涵蓋了各個(gè)領(lǐng)域,包括核心基礎(chǔ)知識(shí),集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計(jì)模式等。擅長(zhǎng)解釋錯(cuò)誤及錯(cuò)誤的原因以及如何解決簡(jiǎn)而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書(shū)籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...

    masturbator 評(píng)論0 收藏0
  • java 基礎(chǔ) - 收藏集 - 掘金

    摘要:基礎(chǔ)知識(shí)復(fù)習(xí)后端掘金的作用表示靜態(tài)修飾符,使用修飾的變量,在中分配內(nèi)存后一直存在,直到程序退出才釋放空間。將對(duì)象編碼為字節(jié)流稱(chēng)之為序列化,反之將字節(jié)流重建成對(duì)象稱(chēng)之為反序列化。 Java 學(xué)習(xí)過(guò)程|完整思維導(dǎo)圖 - 后端 - 掘金JVM 1. 內(nèi)存模型( 內(nèi)存分為幾部分? 堆溢出、棧溢出原因及實(shí)例?線上如何排查?) 2. 類(lèi)加載機(jī)制 3. 垃圾回收 Java基礎(chǔ) 什么是接口?什么是抽象...

    makeFoxPlay 評(píng)論0 收藏0
  • Java架構(gòu)體系學(xué)習(xí)路線圖,第六點(diǎn)尤為重要!

    摘要:有不少朋友問(wèn),除了掌握語(yǔ)法,還要系統(tǒng)學(xué)習(xí)哪些相關(guān)的技術(shù),今天分享一個(gè),互聯(lián)網(wǎng)技術(shù)學(xué)習(xí)路線圖。群內(nèi)已經(jīng)有小伙伴將知識(shí)體系整理好源碼,筆記,學(xué)習(xí)視頻,歡迎加群免費(fèi)取。 showImg(https://segmentfault.com/img/remote/1460000015926035); 我們都知道android依賴(lài)于Java,五六年后進(jìn)入瓶頸期,很多人都學(xué)習(xí)了后臺(tái)業(yè)務(wù)關(guān)的知識(shí)。當(dāng)然我...

    hufeng 評(píng)論0 收藏0
  • java篇 - 收藏集 - 掘金

    摘要:進(jìn)階多線程開(kāi)發(fā)關(guān)鍵技術(shù)后端掘金原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必將下面這段話置于文章開(kāi)頭處保留超鏈接。關(guān)于中間件入門(mén)教程后端掘金前言中間件 Java 開(kāi)發(fā)人員最常犯的 10 個(gè)錯(cuò)誤 - 后端 - 掘金一 、把數(shù)組轉(zhuǎn)成ArrayList 為了將數(shù)組轉(zhuǎn)換為ArrayList,開(kāi)發(fā)者經(jīng)常... Java 9 中的 9 個(gè)新特性 - 后端 - 掘金Java 8 發(fā)布三年多之后,即將快到2017年7月下一個(gè)版...

    OpenDigg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<