国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
Num2:工廠(chǎng)模式
Num3:建造(Builder)模式
Num7:java常用的設(shè)計(jì)模式有哪些
Num5:適配器(Adapter)模式
java常用的設(shè)計(jì)模式有哪些:
java常用的設(shè)計(jì)模式有哪些模式:
首頁(yè) Java Java基礎(chǔ) java常用的設(shè)計(jì)模式有哪些

java常用的設(shè)計(jì)模式有哪些

May 25, 2021 pm 01:51 PM
java 設(shè)計(jì)模式

java常用的設(shè)計(jì)模式:1、單例模式;2、工廠(chǎng)模式;3、建造(Builder)模式;4、java常用的設(shè)計(jì)模式有哪些;5、適配器(Adapter)模式;6、java常用的設(shè)計(jì)模式有哪些;7、java常用的設(shè)計(jì)模式有哪些。

java常用的設(shè)計(jì)模式有哪些

本教程操作環(huán)境:windows7系統(tǒng)、java8版、DELL G3電腦。

Num1:?jiǎn)卫J?/h2>

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

常見(jiàn)寫(xiě)法:

餓漢式

public class Singleton{
    private static Singleton singleton = new Singleton();
    private Singleton(){
    }
    public static Singleton getInstance(){
        return singleton;
    }
}

調(diào)用

Singleton.getInstance().method();

懶漢式

public class Singleton {  
    /* 持有私有靜態(tài)實(shí)例,防止被引用,此處賦值為null,目的是實(shí)現(xiàn)延遲加載 */  
    private static Singleton instance = null;  
  
    /* 私有構(gòu)造方法,防止被實(shí)例化 */  
    private Singleton() {}  
  
    /* 1:懶漢式,靜態(tài)工程方法,創(chuàng)建實(shí)例 */  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
protected void method() {  
        System.out.println("SingletonInner");  
    }
}

調(diào)用:

Singleton.getInstance().method();

優(yōu)點(diǎn):延遲加載(需要的時(shí)候才去加載),適合單線(xiàn)程操作
缺點(diǎn): 線(xiàn)程不安全,在多線(xiàn)程中很容易出現(xiàn)不同步的情況,如在數(shù)據(jù)庫(kù)對(duì)象進(jìn)行的頻繁讀寫(xiě)操作時(shí)。

雙重線(xiàn)程檢查模式

public class SingletonInner {  
    private static volatile SingletonInner sInst = null;  // <<< 這里添加了 volatile  
    /** 
     * 私有的構(gòu)造函數(shù) 
     */  
    private SingletonInner() {}  
  
    public static SingletonInner getInstance() {  
        if (inst == null) {            synchronized (SingletonInner.class) {if (inst == null) {
                    sInst = new SingletonInner();
                }
            }
        }        return sInst;  
    }    protected void method() {  
        System.out.println("SingletonInner");  
    }  
}

調(diào)用:

Singleton.getInstance().method();

優(yōu)點(diǎn):線(xiàn)程安全,支持延時(shí)加載,調(diào)用效率高
缺點(diǎn): 寫(xiě)法復(fù)雜,不簡(jiǎn)潔

內(nèi)部類(lèi)的實(shí)現(xiàn)

public class SingletonInner {  
    /** 
     * 內(nèi)部類(lèi)實(shí)現(xiàn)單例模式 
     * 延遲加載,減少內(nèi)存開(kāi)銷(xiāo)   
     */  
    private static class SingletonHolder {  
        private static SingletonInner instance = new SingletonInner();  
    }  
  
    /** 
     * 私有的構(gòu)造函數(shù) 
     */  
    private SingletonInner() {}  
  
    public static SingletonInner getInstance() {  
        return SingletonHolder.instance;  
    }  
  
    protected void method() {  
        System.out.println("SingletonInner");  
    }  
}

調(diào)用:

Singleton.getInstance().method();

優(yōu)點(diǎn):延遲加載,線(xiàn)程安全(java中class加載時(shí)互斥的),也減少了內(nèi)存消耗,推薦使用內(nèi)部類(lèi)方式。

Num2:工廠(chǎng)模式

基本概念:為創(chuàng)建對(duì)象提供過(guò)渡接口,以便將創(chuàng)建對(duì)象的具體過(guò)程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的。

分為三類(lèi):

  • 簡(jiǎn)單工廠(chǎng)模式Simple Factory:不利于產(chǎn)生系列產(chǎn)品;

  • 工廠(chǎng)方法模式Factory Method:又稱(chēng)為多形性工廠(chǎng);

  • 抽象工廠(chǎng)模式Abstract Factory:又稱(chēng)為工具箱,產(chǎn)生產(chǎn)品族,但不利于產(chǎn)生新的產(chǎn)品;

這三種模式從上到下逐步抽象,并且更具一般性。GOF在《設(shè)計(jì)模式》一書(shū)中將工廠(chǎng)模式分為兩類(lèi):工廠(chǎng)方法模式(Factory Method)與抽象工廠(chǎng)模式(Abstract Factory)。將簡(jiǎn)單工廠(chǎng)模式(Simple Factory)看為工廠(chǎng)方法模式的一種特例,兩者歸為一類(lèi)。

簡(jiǎn)單工廠(chǎng)模式

簡(jiǎn)單工廠(chǎng)模式又稱(chēng)靜態(tài)工廠(chǎng)方法模式。重命名上就可以看出這個(gè)模式一定很簡(jiǎn)單。它存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口。

在簡(jiǎn)單工廠(chǎng)模式中,一個(gè)工廠(chǎng)類(lèi)處于對(duì)產(chǎn)品類(lèi)實(shí)例化調(diào)用的中心位置上,它決定那一個(gè)產(chǎn)品類(lèi)應(yīng)當(dāng)被實(shí)例化, 如同一個(gè)交通警察站在來(lái)往的車(chē)輛流中,決定放行那一個(gè)方向的車(chē)輛向那一個(gè)方向流動(dòng)一樣。

先來(lái)看看它的組成:

  • 工廠(chǎng)類(lèi)角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯。在java中它往往由一個(gè)具體類(lèi)實(shí)現(xiàn)。
  • 抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類(lèi)或者實(shí)現(xiàn)的接口。在java中由接口或者抽象類(lèi)來(lái)實(shí)現(xiàn)。
  • 具體產(chǎn)品角色:工廠(chǎng)類(lèi)所創(chuàng)建的對(duì)象就是此角色的實(shí)例。在java中由一個(gè)具體類(lèi)實(shí)現(xiàn)。

示例代碼:

public class Factory{ //getClass 產(chǎn)生Sample 一般可使用動(dòng)態(tài)類(lèi)裝載裝入類(lèi)。
    public static Sample creator(int which){ 
        if (which==1)
            return new SampleA();
        else if (which==2)
            return new SampleB();
    }
}

還有一種目前比較流行的規(guī)范是把靜態(tài)工廠(chǎng)方法命名為valueOf或者getInstance

valueOf:該方法返回的實(shí)例與它的參數(shù)具有同樣的值,例如:

Integer a=Integer.valueOf(100); //返回取值為100的Integer對(duì)象
public class Complex {
    private final float re;
    private final float im;

    private Complex(float re, float im){
        this.re = re;
        this.im = im;
    }

    public static Complex valueOf(float re, float im){
        return new Complex(re, im);
    }

    public static Complex valueOfPolar(float r, float theta){
        return new Complex((float)(r * Math.cos(theta)), (float)(r * Math.sin(theta)));
    }
}

從上面代碼可以看出,valueOf()方法能執(zhí)行類(lèi)型轉(zhuǎn)換操作,在本例中,把int類(lèi)型的基本數(shù)據(jù)轉(zhuǎn)換為Integer對(duì)象。

getInstance:返回的實(shí)例與參數(shù)匹配,例如:

Calendar cal=Calendar.getInstance(Locale.CHINA); //返回符合中國(guó)標(biāo)準(zhǔn)的日歷

工廠(chǎng)方法模式

工廠(chǎng)方法模式是簡(jiǎn)單工廠(chǎng)模式的進(jìn)一步抽象化和推廣,工廠(chǎng)方法模式里不再只由一個(gè)工廠(chǎng)類(lèi)決定那一個(gè)產(chǎn)品類(lèi)應(yīng)當(dāng)被實(shí)例化,這個(gè)決定被交給抽象工廠(chǎng)的子類(lèi)去做。
來(lái)看下它的組成:

  • 抽象工廠(chǎng)角色: 這是工廠(chǎng)方法模式的核心,它與應(yīng)用程序無(wú)關(guān)。是具體工廠(chǎng)角色必須實(shí)現(xiàn)的接口或者必須繼承的父類(lèi)。在java中它由抽象類(lèi)或者接口來(lái)實(shí)現(xiàn)。
  • 具體工廠(chǎng)角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象
  • 抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類(lèi)或者是實(shí)現(xiàn)的接口。在java中一般有抽象類(lèi)或者接口來(lái)實(shí)現(xiàn)。
  • 具體產(chǎn)品角色:具體工廠(chǎng)角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。在java中由具體的類(lèi)來(lái)實(shí)現(xiàn)。

工廠(chǎng)方法模式使用繼承自抽象工廠(chǎng)角色的多個(gè)子類(lèi)來(lái)代替簡(jiǎn)單工廠(chǎng)模式中的“上帝類(lèi)”。正如上面所說(shuō),這樣便分擔(dān)了對(duì)象承受的壓力;而且這樣使得結(jié)構(gòu)變得靈活 起來(lái)——當(dāng)有新的產(chǎn)品(即暴發(fā)戶(hù)的汽車(chē))產(chǎn)生時(shí),只要按照抽象產(chǎn)品角色、抽象工廠(chǎng)角色提供的合同來(lái)生成,那么就可以被客戶(hù)使用,而不必去修改任何已有的代 碼??梢钥闯龉S(chǎng)角色的結(jié)構(gòu)也是符合開(kāi)閉原則的!

示例代碼:

//抽象產(chǎn)品角色
public interface Moveable {
    void run();
}
//具體產(chǎn)品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}
//具體產(chǎn)品角色
public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}

//抽象工廠(chǎng)
public abstract class VehicleFactory {
    abstract Moveable create();
}
//具體工廠(chǎng)
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}
//具體工廠(chǎng)
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}
//測(cè)試類(lèi)
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}

可以看出工廠(chǎng)方法的加入,使得對(duì)象的數(shù)量成倍增長(zhǎng)。當(dāng)產(chǎn)品種類(lèi)非常多時(shí),會(huì)出現(xiàn)大量的與之對(duì)應(yīng)的工廠(chǎng)對(duì)象,這不是我們所希望的。因?yàn)槿绻荒鼙苊膺@種情 況,可以考慮使用簡(jiǎn)單工廠(chǎng)模式與工廠(chǎng)方法模式相結(jié)合的方式來(lái)減少工廠(chǎng)類(lèi):即對(duì)于產(chǎn)品樹(shù)上類(lèi)似的種類(lèi)(一般是樹(shù)的葉子中互為兄弟的)使用簡(jiǎn)單工廠(chǎng)模式來(lái)實(shí) 現(xiàn)。

簡(jiǎn)單工廠(chǎng)和工廠(chǎng)方法模式的比較

工廠(chǎng)方法模式和簡(jiǎn)單工廠(chǎng)模式在定義上的不同是很明顯的。工廠(chǎng)方法模式的核心是一個(gè)抽象工廠(chǎng)類(lèi),而不像簡(jiǎn)單工廠(chǎng)模式, 把核心放在一個(gè)實(shí)類(lèi)上。工廠(chǎng)方法模式可以允許很多實(shí)的工廠(chǎng)類(lèi)從抽象工廠(chǎng)類(lèi)繼承下來(lái), 從而可以在實(shí)際上成為多個(gè)簡(jiǎn)單工廠(chǎng)模式的綜合,從而推廣了簡(jiǎn)單工廠(chǎng)模式。
反過(guò)來(lái)講,簡(jiǎn)單工廠(chǎng)模式是由工廠(chǎng)方法模式退化而來(lái)。設(shè)想如果我們非常確定一個(gè)系統(tǒng)只需要一個(gè)實(shí)的工廠(chǎng)類(lèi), 那么就不妨把抽象工廠(chǎng)類(lèi)合并到實(shí)的工廠(chǎng)類(lèi)中去。而這樣一來(lái),我們就退化到簡(jiǎn)單工廠(chǎng)模式了。

抽象工廠(chǎng)模式

示例代碼:

//抽象工廠(chǎng)類(lèi)
public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}
//具體工廠(chǎng)類(lèi),其中Food,Vehicle,Weapon是抽象類(lèi),
public class DefaultFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}
//測(cè)試類(lèi)
public class Test {
    public static void main(String[] args) {
        AbstractFactory f = new DefaultFactory();
        Vehicle v = f.createVehicle();
        v.run();
        Weapon w = f.createWeapon();
        w.shoot();
        Food a = f.createFood();
        a.printName();
    }
}

在抽象工廠(chǎng)模式中,抽象產(chǎn)品 (AbstractProduct) 可能是一個(gè)或多個(gè),從而構(gòu)成一個(gè)或多個(gè)產(chǎn)品族(Product Family)。 在只有一個(gè)產(chǎn)品族的情況下,抽象工廠(chǎng)模式實(shí)際上退化到工廠(chǎng)方法模式。

總結(jié)

  • 簡(jiǎn)單工廠(chǎng)模式是由一個(gè)具體的類(lèi)去創(chuàng)建其他類(lèi)的實(shí)例,父類(lèi)是相同的,父類(lèi)是具體的。

  • 工廠(chǎng)方法模式是有一個(gè)抽象的父類(lèi)定義公共接口,子類(lèi)負(fù)責(zé)生成具體的對(duì)象,這樣做的目的是將類(lèi)的實(shí)例化操作延遲到子類(lèi)中完成。

  • 抽象工廠(chǎng)模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)須指定他們具體的類(lèi)。它針對(duì)的是有多個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu)。而工廠(chǎng)方法模式針對(duì)的是一個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu)。

Num3:建造(Builder)模式

基本概念:是一種對(duì)象構(gòu)建的設(shè)計(jì)模式,它可以將復(fù)雜對(duì)象的建造過(guò)程抽象出來(lái)(抽象類(lèi)別),使這個(gè)抽象過(guò)程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對(duì)象。

java常用的設(shè)計(jì)模式有哪些是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶(hù)可以只通過(guò)指定復(fù)雜對(duì)象的類(lèi)型和內(nèi)容就可以構(gòu)建它們。用戶(hù)不知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。java常用的設(shè)計(jì)模式有哪些是非常類(lèi)似抽象工廠(chǎng)模式,細(xì)微的區(qū)別大概只有在反復(fù)使用中才能體會(huì)到。

UML結(jié)構(gòu)圖:

java常用的設(shè)計(jì)模式有哪些

上圖是Strategy 模式的結(jié)構(gòu)圖,讓我們可以進(jìn)行更方便的描述:

  • Builder:為創(chuàng)建一個(gè)Product對(duì)象的各個(gè)部件指定抽象接口。

  • ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,提供一個(gè)檢索產(chǎn)品的接口

  • Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象。

  • Product:表示被構(gòu)造的復(fù)雜對(duì)象。ConcreateBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程。

為何使用

是為了將構(gòu)建復(fù)雜對(duì)象的過(guò)程和它的部件解耦。注意:是解耦過(guò)程和部件。
因?yàn)橐粋€(gè)復(fù)雜的對(duì)象,不但有很多大量組成部分,如汽車(chē),有很多部件:車(chē)輪、方向盤(pán)、發(fā)動(dòng)機(jī),還有各種小零件等等,部件很多,但遠(yuǎn)不止這些,如何將這些部件裝配成一輛汽車(chē),這個(gè)裝配過(guò)程也很復(fù)雜(需要很好的組裝技術(shù)),java常用的設(shè)計(jì)模式有哪些就是為了將部件和組裝過(guò)程分開(kāi)。

如何使用

首先假設(shè)一個(gè)復(fù)雜對(duì)象是由多個(gè)部件組成的,java常用的設(shè)計(jì)模式有哪些是把復(fù)雜對(duì)象的創(chuàng)建和部件的創(chuàng)建分別開(kāi)來(lái),分別用Builder類(lèi)和Director類(lèi)來(lái)表示。

首先,需要一個(gè)接口,它定義如何創(chuàng)建復(fù)雜對(duì)象的各個(gè)部件:

public interface Builder {
   //創(chuàng)建部件A  比如創(chuàng)建汽車(chē)車(chē)輪void buildPartA();
   //創(chuàng)建部件B 比如創(chuàng)建汽車(chē)方向盤(pán)void buildPartB();
   //創(chuàng)建部件C 比如創(chuàng)建汽車(chē)發(fā)動(dòng)機(jī)void buildPartC();
   //返回最后組裝成品結(jié)果 (返回最后裝配好的汽車(chē))
   //成品的組裝過(guò)程不在這里進(jìn)行,而是轉(zhuǎn)移到下面的Director類(lèi)中進(jìn)行.
   //從而實(shí)現(xiàn)了解耦過(guò)程和部件    Product getResult();
}

用Director構(gòu)建最后的復(fù)雜對(duì)象,而在上面Builder接口中封裝的是如何創(chuàng)建一個(gè)個(gè)部件(復(fù)雜對(duì)象是由這些部件組成的),也就是說(shuō)Director的內(nèi)容是如何將部件最后組裝成成品:

public class Director {
    private Builder builder;
    public Director( Builder builder ) {
        this.builder = builder;
   }
   // 將部件partA partB partC最后組成復(fù)雜對(duì)象
   //這里是將車(chē)輪 方向盤(pán)和發(fā)動(dòng)機(jī)組裝成汽車(chē)的過(guò)程
    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

Builder的具體實(shí)現(xiàn)ConcreteBuilder:

  • 通過(guò)具體完成接口Builder來(lái)構(gòu)建或裝配產(chǎn)品的部件;
  • 定義并明確它所要?jiǎng)?chuàng)建的是什么具體東西;
  • 提供一個(gè)可以重新獲取產(chǎn)品的接口。
public class ConcreteBuilder implements Builder {
 Part partA, partB, partC;
 public void buildPartA() {
  //這里是具體如何構(gòu)建 }
 public void buildPartB() {
  //這里是具體如何構(gòu)建 }
 public void buildPartC() {
  //這里是具體如何構(gòu)建 }
 public Product getResult() {
  //返回最后組裝成品結(jié)果 }
}

復(fù)雜對(duì)象:產(chǎn)品Product:

public interface Product { }

復(fù)雜對(duì)象的部件:

public interface Part { }

我們看看如何調(diào)用java常用的設(shè)計(jì)模式有哪些:

ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );
director.construct();
Product product = builder.getResult();

java常用的設(shè)計(jì)模式有哪些的應(yīng)用

在Java實(shí)際使用中,我們經(jīng)常用到"池"(Pool)的概念,當(dāng)資源提供者無(wú)法提供足夠的資源,并且這些資源需要被很多用戶(hù)反復(fù)共享時(shí),就需要使用池。"池"實(shí)際是一段內(nèi)存,當(dāng)池中有一些復(fù)雜的資源的"斷肢"(比如數(shù)據(jù)庫(kù)的連接池,也許有時(shí)一個(gè)連接會(huì)中斷),如果循環(huán)再利用這些"斷肢",將提高內(nèi)存使用效率,提高池的性能。修改java常用的設(shè)計(jì)模式有哪些中Director類(lèi)使之能診斷"斷肢"斷在哪個(gè)部件上,再修復(fù)這個(gè)部件。

Num4:java常用的設(shè)計(jì)模式有哪些

基本概念:java常用的設(shè)計(jì)模式有哪些定義了一種一對(duì)多的依賴(lài)關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己。java常用的設(shè)計(jì)模式有哪些又叫發(fā)布-訂閱(Publish/Subscribe)模式。

UML結(jié)構(gòu)圖

java常用的設(shè)計(jì)模式有哪些

上圖是Observer 模式的結(jié)構(gòu)圖,讓我們可以進(jìn)行更方便的描述:

  • Subject類(lèi):它把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)聚集里,每個(gè)主題都可以有任何數(shù)量的觀察著。抽象主題提供一個(gè)接口,可以增加和刪除觀察著對(duì)象。

  • Observer類(lèi):抽象觀察者,為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)更新自己。

  • ConcreteSubject類(lèi):具體主題,將有關(guān)狀態(tài)存入具體觀察者對(duì)象;在具體主題的內(nèi)部狀態(tài)改變時(shí),給所有登記過(guò)的觀察者發(fā)出通知。

  • ConcreteObserver類(lèi):具體觀察者,實(shí)現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。

如何使用

例如:老師有電話(huà)號(hào)碼,學(xué)生需要知道老師的電話(huà)號(hào)碼以便于在合適的時(shí)候撥打,在這樣的組合中,老師就是一個(gè)被觀察者(Subject),學(xué)生就是需要知道信息的觀察者,當(dāng)老師的電話(huà)號(hào)碼發(fā)生改變時(shí),學(xué)生得到通知,并更新相應(yīng)的電話(huà)記錄。

先創(chuàng)建一個(gè)Subject類(lèi):

/**  
 * Subject(目標(biāo),Subject):    
 * 目標(biāo)知道它的觀察者??梢杂腥我舛鄠€(gè)觀察者觀察同一個(gè)目標(biāo)。  
 * 提供注冊(cè)和刪除觀察者對(duì)象的接口。  
 */  public interface Subject {  
    public void attach(Observer mObserver);  
    public void detach(Observer mObserver);        
    public void notice();  
}

創(chuàng)建Observer類(lèi):

/**  
 * Observer(觀察者,Observer):  
 * 為那些在目標(biāo)發(fā)生改變時(shí)需要獲得通知的對(duì)象定義一個(gè)更新接口。   
 */  public interface Observer {  
    public void update();  
}

創(chuàng)建ConcreteSubject類(lèi):

/**  
 * ConcreteSubject(具體目標(biāo),Teacher)  
 * 將有關(guān)狀態(tài)存入各ConcreteObserve對(duì)象。  
 * 當(dāng)他的狀態(tài)發(fā)生改變時(shí),向他的各個(gè)觀察者發(fā)出通知。   
 */  public class Teacher implements Subject{  
     
    private String phone;  
    private Vector students;  
    
    public Teacher(){  
        phone = "";  
        students = new Vector();  
    }  
  
    @Override  
    public void attach(Observer mObserver) {  
        students.add(mObserver);  
    }  
  
    @Override  
    public void detach(Observer mObserver) {  
        students.remove(mObserver);  
    }  
  
    @Override  
    public void notice() {  
        for(int i=0;i<students.size();i++){  
            ((Observer)students.get(i)).update();  
        }  
    }  
  
    public String getPhone() {  
        return phone;  
    }  
  
    public void setPhone(String phone) {  
        this.phone = phone;  
        notice();  
    }  
}

創(chuàng)建ConcreteObserver類(lèi):

/**  
 * ConcreteObserver(具體觀察者, Student):  
 * 維護(hù)一個(gè)指向ConcreteSubject對(duì)象的引用。  
 * 存儲(chǔ)有關(guān)狀態(tài),這些狀態(tài)應(yīng)與目標(biāo)的狀態(tài)保持一致。  
 * 實(shí)現(xiàn)Observer的更新接口以使自身狀態(tài)與目標(biāo)的狀態(tài)保持一致。  
 */  public class Student implements Observer{  
  
    private String name;  
    private String phone;  
    private Teacher mTeacher;  
      
    public Student(String name,Teacher t){  
       this.name = name;  
       mTeacher = t;  
    }  
      
    public void show(){  
       System.out.println("Name:"+name+"\nTeacher&#39;sphone:" + phone);  
    }  
      
    @Override  
    public void update() {  
        phone = mTeacher.getPhone();  
    }  
}

客戶(hù)端測(cè)試:

/**  
 * 觀察者(Observer)模式測(cè)試類(lèi)   
 */  public class ObserverClient {  
    public static void main(String[] args) {  
       Vector students = new Vector();  
       Teacher t = new Teacher();  
       for(int i= 0;i<10;i++){  
           Student st = new Student("Andy.Chen"+i,t);  
           students.add(st);  
           t.attach(st);  
       }  
         
       System.out.println("Welcome to Andy.Chen Blog!" +"\n"   
                   +"Observer Patterns." +"\n"  
                   +"-------------------------------");  
         
       t.setPhone("12345678");  
       for(int i=0;i<3;i++)  
           ((Student)students.get(i)).show();  
         
       t.setPhone("87654321");  
       for(int i=0;i<3;i++)  
           ((Student)students.get(i)).show();  
    }  
}

程序運(yùn)行結(jié)果如下:

Welcome to Andy.Chen Blog!  Observer Patterns.  
-------------------------------  Name:Andy.Chen0  
Teacher&#39;sphone:12345678  
Name:Andy.Chen1  
Teacher&#39;sphone:12345678  
Name:Andy.Chen2  
Teacher&#39;sphone:12345678  
Name:Andy.Chen0  
Teacher&#39;sphone:87654321  
Name:Andy.Chen1  
Teacher&#39;sphone:87654321  
Name:Andy.Chen2  
Teacher&#39;sphone:87654321

總結(jié)

java常用的設(shè)計(jì)模式有哪些何時(shí)適用?

  • 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴(lài)于另一方面。將這二者封裝在獨(dú)立的對(duì)象中可以使他們各自獨(dú)立地改變和復(fù)用。

  • 當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象,而不知道具體由多少對(duì)象有待改變。

  • 當(dāng)一個(gè)對(duì)象必須通知其他對(duì)象,而它又不能假定其他對(duì)象是誰(shuí),換言之,你不希望這些對(duì)象是緊密耦合的。讓耦合的雙方都依賴(lài)于抽象,而不是依賴(lài)于具體。

Num5:適配器(Adapter)模式

基本概念:適配器模式把一個(gè)類(lèi)的接口變換成客戶(hù)端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠在一起工作。

適配器模式的用途

用電器做例子,筆記本電腦的插頭一般都是三相的,即除了陽(yáng)極、陰極外,還有一個(gè)地極。而有些地方的電源插座卻只有兩極,沒(méi)有地極。電源插座與筆記本電腦的電源插頭不匹配使得筆記本電腦無(wú)法使用。這時(shí)候一個(gè)三相到兩相的轉(zhuǎn)換器(適配器)就能解決此問(wèn)題,而這正像是本模式所做的事情。

適配器模式的結(jié)構(gòu)
適配器模式有類(lèi)的適配器模式對(duì)象的適配器模式兩種不同的形式。

java常用的設(shè)計(jì)模式有哪些:

java常用的設(shè)計(jì)模式有哪些

在上圖中可以看出,Adaptee類(lèi)并沒(méi)有sampleOperation2()方法,而客戶(hù)端則期待這個(gè)方法。為使客戶(hù)端能夠使用Adaptee類(lèi),提供一個(gè)中間環(huán)節(jié),即類(lèi)Adapter,把Adaptee的API與Target類(lèi)的API銜接起來(lái)。Adapter與Adaptee是繼承關(guān)系,這決定了這個(gè)適配器模式是類(lèi)的:

  • 目標(biāo)(Target)角色:這就是所期待得到的接口。注意:由于這里討論的是java常用的設(shè)計(jì)模式有哪些,因此目標(biāo)不可以是類(lèi)。
  • 源(Adapee)角色:現(xiàn)在需要適配的接口。
  • 適配器(Adaper)角色:適配器類(lèi)是本模式的核心。適配器把源接口轉(zhuǎn)換成目標(biāo)接口。顯然,這一角色不可以是接口,而必須是具體類(lèi)。
java常用的設(shè)計(jì)模式有哪些模式:

java常用的設(shè)計(jì)模式有哪些

從上圖可以看出,Adaptee類(lèi)并沒(méi)有sampleOperation2()方法,而客戶(hù)端則期待這個(gè)方法。為使客戶(hù)端能夠使用Adaptee類(lèi),需要提供一個(gè)包裝(Wrapper)類(lèi)Adapter。這個(gè)包裝類(lèi)包裝了一個(gè)Adaptee的實(shí)例,從而此包裝類(lèi)能夠把Adaptee的API與Target類(lèi)的API銜接起來(lái)。Adapter與Adaptee是委派關(guān)系,這決定了適配器模式是對(duì)象的。

示例代碼:

public interface Target {    /**
     * 這是源類(lèi)Adaptee也有的方法     */
    public void sampleOperation1(); 
    /**
     * 這是源類(lèi)Adapteee沒(méi)有的方法     */
    public void sampleOperation2(); 
}public class Adaptee {    public void sampleOperation1(){}
}

適配器類(lèi):

public class Adapter {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }
    /**
     * 源類(lèi)Adaptee有方法sampleOperation1
     * 因此適配器類(lèi)直接委派即可
     */
    public void sampleOperation1(){
        this.adaptee.sampleOperation1();
    }
    /**
     * 源類(lèi)Adaptee沒(méi)有方法sampleOperation2
     * 因此由適配器類(lèi)需要補(bǔ)充此方法
     */
    public void sampleOperation2(){
        //寫(xiě)相關(guān)的代碼
    }
}

類(lèi)適配器和java常用的設(shè)計(jì)模式有哪些的權(quán)衡

  • 類(lèi)適配器使用對(duì)象繼承的方式,是靜態(tài)的定義方式;而java常用的設(shè)計(jì)模式有哪些使用對(duì)象組合的方式,是動(dòng)態(tài)組合的方式。
  • 對(duì)于類(lèi)適配器由于適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類(lèi)一起工作,因?yàn)槔^承是靜態(tài)的關(guān)系,當(dāng)適配器繼承了Adaptee后,就不可能再去處理 Adaptee的子類(lèi)了。

  • 對(duì)于java常用的設(shè)計(jì)模式有哪些一個(gè)適配器可以把多種不同的源適配到同一個(gè)目標(biāo)。換言之,同一個(gè)適配器可以把源類(lèi)和它的子類(lèi)都適配到目標(biāo)接口。因?yàn)閖ava常用的設(shè)計(jì)模式有哪些采用的是對(duì)象組合的關(guān)系,只要對(duì)象類(lèi)型正確,是不是子類(lèi)都無(wú)所謂。

  • 對(duì)于類(lèi)適配器適配器可以重定義Adaptee的部分行為,相當(dāng)于子類(lèi)覆蓋父類(lèi)的部分實(shí)現(xiàn)方法。

  • 對(duì)于java常用的設(shè)計(jì)模式有哪些要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類(lèi)來(lái)實(shí)現(xiàn)重定義,然后讓適配器組合子類(lèi)。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時(shí)適用于所有的源。

  • 對(duì)于類(lèi)適配器,僅僅引入了一個(gè)對(duì)象,并不需要額外的引用來(lái)間接得到Adaptee。

  • 對(duì)于java常用的設(shè)計(jì)模式有哪些,需要額外的引用來(lái)間接得到Adaptee。

建議盡量使用java常用的設(shè)計(jì)模式有哪些的實(shí)現(xiàn)方式,多用合成或聚合、少用繼承。當(dāng)然,具體問(wèn)題具體分析,根據(jù)需要來(lái)選用實(shí)現(xiàn)方式,最適合的才是最好的。

適配器模式的優(yōu)點(diǎn)

  • 更好的復(fù)用性:系統(tǒng)需要使用現(xiàn)有的類(lèi),而此類(lèi)的接口不符合系統(tǒng)的需要。那么通過(guò)適配器模式就可以讓這些功能得到更好的復(fù)用。

  • 更好的擴(kuò)展性:在實(shí)現(xiàn)適配器功能的時(shí)候,可以調(diào)用自己開(kāi)發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能。

適配器模式的缺點(diǎn)

  過(guò)多的使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是A接口,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無(wú)異于一場(chǎng)災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對(duì)系統(tǒng)進(jìn)行重構(gòu)。

Num6:java常用的設(shè)計(jì)模式有哪些

基本概念:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。也可以說(shuō),在出發(fā)點(diǎn)到目的地之間有一道中間層,意為代理。

為什么要使用

  • 授權(quán)機(jī)制不同級(jí)別的用戶(hù)對(duì)同一對(duì)象擁有不同的訪(fǎng)問(wèn)權(quán)利,如在論壇系統(tǒng)中,就使用Proxy進(jìn)行授權(quán)機(jī)制控制,訪(fǎng)問(wèn)論壇有兩種人:注冊(cè)用戶(hù)和游客(未注冊(cè)用戶(hù)),論壇就通過(guò)類(lèi)似ForumProxy這樣的代理來(lái)控制這兩種用戶(hù)對(duì)論壇的訪(fǎng)問(wèn)權(quán)限。

  • 某個(gè)客戶(hù)端不能直接操作到某個(gè)對(duì)象,但又必須和那個(gè)對(duì)象有所互動(dòng)。

舉例兩個(gè)具體情況:

  • 如果那個(gè)對(duì)象是一個(gè)是很大的圖片,需要花費(fèi)很長(zhǎng)時(shí)間才能顯示出來(lái),那么當(dāng)這個(gè)圖片包含在文檔中時(shí),使用編輯器或?yàn)g覽器打開(kāi)這個(gè)文檔,打開(kāi)文檔必須很迅速,不能等待大圖片處理完成,這時(shí)需要做個(gè)圖片Proxy來(lái)代替真正的圖片。
  • 如果那個(gè)對(duì)象在Internet的某個(gè)遠(yuǎn)端服務(wù)器上,直接操作這個(gè)對(duì)象因?yàn)榫W(wǎng)絡(luò)速度原因可能比較慢,那我們可以先用Proxy來(lái)代替那個(gè)對(duì)象。

總之原則是,對(duì)于開(kāi)銷(xiāo)很大的對(duì)象,只有在使用它時(shí)才創(chuàng)建,這個(gè)原則可以為我們節(jié)省很多寶貴的Java內(nèi)存。所以,有些人認(rèn)為Java耗費(fèi)資源內(nèi)存,我以為這和程序編制思路也有一定的關(guān)系。

如何使用

以論壇系統(tǒng)為例,訪(fǎng)問(wèn)論壇系統(tǒng)的用戶(hù)有多種類(lèi)型:注冊(cè)普通用戶(hù)、論壇管理者、系統(tǒng)管理者、游客。注冊(cè)普通用戶(hù)才能發(fā)言,論壇管理者可以管理他被授權(quán)的論壇,系統(tǒng)管理者可以管理所有事務(wù)等,這些權(quán)限劃分和管理是使用Proxy完成的。
在Forum中陳列了有關(guān)論壇操作的主要行為,如論壇名稱(chēng),論壇描述的獲取和修改,帖子發(fā)表刪除編輯等,在ForumPermissions中定義了各種級(jí)別權(quán)限的用戶(hù):

public class ForumPermissions implements Cacheable {
    /**
    * Permission to read object.
    */
    public static final int READ = 0;

    /**
    * Permission to administer the entire sytem.
    */
    public static final int SYSTEM_ADMIN = 1;

    /**
    * Permission to administer a particular forum.
    */
    public static final int FORUM_ADMIN = 2;

    /**
    * Permission to administer a particular user.
    */
    public static final int USER_ADMIN = 3;

    /**
    * Permission to administer a particular group.
    */
    public static final int GROUP_ADMIN = 4;

    /**
    * Permission to moderate threads.
    */
    public static final int MODERATE_THREADS = 5;

    /**
    * Permission to create a new thread.
    */
    public static final int CREATE_THREAD = 6;

    /**
    * Permission to create a new message.
    */
    public static final int CREATE_MESSAGE = 7;

    /**
    * Permission to moderate messages.
    */
    public static final int MODERATE_MESSAGES = 8;
  
    public boolean isSystemOrForumAdmin() {
        return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
    }

//相關(guān)操作代碼
}

因此,F(xiàn)orum中各種操作權(quán)限是和ForumPermissions定義的用戶(hù)級(jí)別有關(guān)系的,作為接口Forum的實(shí)現(xiàn):ForumProxy正是將這種對(duì)應(yīng)關(guān)系聯(lián)系起來(lái)。比如,修改Forum的名稱(chēng),只有論壇管理者或系統(tǒng)管理者可以修改,代碼如下:

public class ForumProxy implements Forum {
    private ForumPermissions permissions;
    private Forum forum;
    this.authorization = authorization;

    public ForumProxy(Forum forum, Authorization authorization,ForumPermissions permissions){
        this.forum = forum;
        this.authorization = authorization;
        this.permissions = permissions;
    }
    .....
    public void setName(String name) throws UnauthorizedException,
        ForumAlreadyExistsException{
        //只有是系統(tǒng)或論壇管理者才可以修改名稱(chēng)
      if (permissions.isSystemOrForumAdmin()) {
        forum.setName(name);
      }
    else {
    throw new UnauthorizedException();
    }
    }
    ...

}

而DbForum才是接口Forum的真正實(shí)現(xiàn),以修改論壇名稱(chēng)為例:

public class DbForum implements Forum, Cacheable {
    ...
    public void setName(String name) throws ForumAlreadyExistsException {
  ....
        this.name = name;
       //這里真正將新名稱(chēng)保存到數(shù)據(jù)庫(kù)中
       saveToDb();
  ....
    }
    ...
}

凡是涉及到對(duì)論壇名稱(chēng)修改這一事件,其他程序都首先得和ForumProxy打交道,由ForumProxy決定是否有權(quán)限做某一樣事情,F(xiàn)orumProxy是個(gè)名副其實(shí)的"網(wǎng)關(guān)","安全代理系統(tǒng)"。
在平時(shí)應(yīng)用中,無(wú)可避免總要涉及到系統(tǒng)的授權(quán)或安全體系,不管你有無(wú)意識(shí)的使用Proxy,實(shí)際你已經(jīng)在使用Proxy了。

流程圖

java常用的設(shè)計(jì)模式有哪些

Num7:java常用的設(shè)計(jì)模式有哪些

基本概念:java常用的設(shè)計(jì)模式有哪些(Decorator),動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),java常用的設(shè)計(jì)模式有哪些比生成子類(lèi)更為靈活。

UML結(jié)構(gòu)圖

java常用的設(shè)計(jì)模式有哪些

上圖是Decorator 模式的結(jié)構(gòu)圖,讓我們可以進(jìn)行更方便的描述:

  • Component是定義一個(gè)對(duì)象接口,可以給這些對(duì)象動(dòng)態(tài)地添加職責(zé)。

  • ConcreteComponent是定義了一個(gè)具體的對(duì)象,也可以給這個(gè)對(duì)象添加一些職責(zé)。

Decorator是裝飾抽象類(lèi),繼承了Component,從外類(lèi)來(lái)擴(kuò)展Component類(lèi)的功能,但對(duì)于Component來(lái)說(shuō),是無(wú)需知道Decorator存在的。ConcreteDecorator就是具體的裝飾對(duì)象,起到給Component添加職責(zé)的功能。

如何使用

假設(shè)情景:某人裝扮自己形象,穿衣服,褲子,鞋子,戴帽子等來(lái)把自己給包裝起來(lái),需要把所需的功能按正確的順序串聯(lián)起來(lái)進(jìn)行控制,我們應(yīng)該如何設(shè)計(jì)才能做到呢?如下,先看下代碼結(jié)構(gòu)圖:

先創(chuàng)建一個(gè)接口類(lèi):Component.java

public interface Component {    
    void show();
}

創(chuàng)建一個(gè)具體的 ConcreteComponent 來(lái)實(shí)現(xiàn) Component 接口:Person.java

public class Person implements Component{
    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    @Override
    public void show() {
        System.out.println("裝扮的" + name);
    }
}

創(chuàng)建裝飾類(lèi) Decorator 實(shí)現(xiàn) Component 接口

public class Decorator implements Component{
    private Component mComponent;
    public void decoratorObj(Component component){
        mComponent = component;
    }

    @Override
    public void show() {
        if(mComponent != null){
            mComponent.show();
        }
    }
}

分別創(chuàng)建具體的裝飾類(lèi):Jeans.java , Pelisse.java, Sandal.java ...等等,分別繼承 Decorator.java 類(lèi)

/** 牛仔褲 */
public class Jeans extends Decorator {
    @Override
    public void show(){
        System.out.println("穿牛仔褲");
        super.show();
    }
    
}

客戶(hù)端測(cè)試類(lèi)

/**
 * java常用的設(shè)計(jì)模式有哪些測(cè)試客戶(hù)端
 */
public class DecoratorClient {
    public static void main(String[] args) {
        System.out.println("Welcome to Andy.Chen Blog!" +"\n" 
                   +"Decorator Patterns." +"\n");
        
        Person mPerson = new Person("Andy");
        
        Sandal mSandal = new Sandal();
        Jeans mJeans = new Jeans();
        TShirt mShirt = new TShirt();
        
        mShirt.decoratorObj(mPerson);
        mJeans.decoratorObj(mShirt);
        mSandal.decoratorObj(mJeans);
        mSandal.show(); 
    }
}

測(cè)試結(jié)果

Welcome to Andy.Chen Blog!
Decorator Patterns.
  
穿涼鞋
穿牛仔褲
穿T-Shirt
裝扮的Andy

總結(jié)

Decorator模式有以下的優(yōu)缺點(diǎn):

  • 比靜態(tài)繼承更靈活與對(duì)象的靜態(tài)繼承相比,Decorator模式提供了更加靈活的向?qū)ο筇砑勇氊?zé)的方式,可以使用添加和分離的方法,用裝飾在運(yùn)行時(shí)刻增加和刪除職責(zé)。使用繼承機(jī)制增加職責(zé)需要?jiǎng)?chuàng)建一個(gè)新的子類(lèi),如果需要為原來(lái)所有的子類(lèi)都添加功能的話(huà),每個(gè)子類(lèi)都需要重寫(xiě),增加系統(tǒng)的復(fù)雜度,此外可以為一個(gè)特定的Component類(lèi)提供多個(gè)Decorator,這種混合匹配是適用繼承很難做到的。

  • 避免在層次結(jié)構(gòu)高層的類(lèi)有太多的特征,Decorator模式提供了一種“即用即付”的方法來(lái)添加職責(zé),他并不試圖在一個(gè)復(fù)雜的可訂制的類(lèi)中支持所有可預(yù)見(jiàn)的特征,相反可以定義一個(gè)簡(jiǎn)單的類(lèi),并且用Decorator類(lèi)給他逐漸的添加功能,從簡(jiǎn)單的部件組合出復(fù)雜的功能。

  • Decorator?與它的Component不一樣Decorator是一個(gè)透明的包裝,如果我們從對(duì)象標(biāo)識(shí)的觀點(diǎn)出發(fā),一個(gè)被裝飾了的組件與這個(gè)組件是有差別的,因此使用裝飾時(shí)不應(yīng)該以來(lái)對(duì)象標(biāo)識(shí)。

  • 產(chǎn)生許多小對(duì)象,采用Decorator模式進(jìn)行系統(tǒng)設(shè)計(jì)往往會(huì)產(chǎn)生許多看上去類(lèi)似的小對(duì)象,這些對(duì)象僅僅在他們相互連接的方式上有所不同。

相關(guān)視頻教程推薦:Java視頻教程

以上是java常用的設(shè)計(jì)模式有哪些的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線(xiàn)人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開(kāi)始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常并關(guān)閉連接,避免連接泄漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,并保持事務(wù)盡可能短以提升性能。

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類(lèi)替代舊的Date和Calendar類(lèi);2.通過(guò)LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過(guò)DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過(guò)Instant與舊日期類(lèi)型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線(xiàn)

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過(guò)回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存泄漏風(fēng)險(xiǎn)。1.GC從根對(duì)象(如棧變量、活動(dòng)線(xiàn)程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無(wú)法到達(dá)的對(duì)象被標(biāo)記為垃圾。2.基于標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。3.采用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類(lèi)元數(shù)據(jù)。4.JVM提供多種GC器:SerialGC適用于小型應(yīng)用;ParallelGC提升吞吐量;CMS降

使用HTML'輸入類(lèi)型”作為用戶(hù)數(shù)據(jù) 使用HTML'輸入類(lèi)型”作為用戶(hù)數(shù)據(jù) Aug 03, 2025 am 11:07 AM

選擇合適的HTMLinput類(lèi)型能提升數(shù)據(jù)準(zhǔn)確性、增強(qiáng)用戶(hù)體驗(yàn)并提高可用性。1.根據(jù)數(shù)據(jù)類(lèi)型選用對(duì)應(yīng)input類(lèi)型,如text、email、tel、number和date,可實(shí)現(xiàn)自動(dòng)校驗(yàn)和適配鍵盤(pán);2.利用HTML5新增類(lèi)型如url、color、range和search,可提供更直觀的交互方式;3.配合使用placeholder和required屬性,可提升表單填寫(xiě)效率和正確率,但需注意placeholder不能替代label。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說(shuō)明 以身作則,解釋說(shuō)明 Aug 02, 2025 am 06:26 AM

defer用于在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按后進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用于文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用于recover;5.避免在循環(huán)中濫用defer,防止資源泄漏;正確使用可提升代碼安全性和可讀性。

以身作則http中間件記錄示例 以身作則http中間件記錄示例 Aug 03, 2025 am 11:35 AM

Go中的HTTP日志中間件可記錄請(qǐng)求方法、路徑、客戶(hù)端IP和耗時(shí),1.使用http.HandlerFunc包裝處理器,2.在調(diào)用next.ServeHTTP前后記錄開(kāi)始時(shí)間和結(jié)束時(shí)間,3.通過(guò)r.RemoteAddr和X-Forwarded-For頭獲取真實(shí)客戶(hù)端IP,4.利用log.Printf輸出請(qǐng)求日志,5.將中間件應(yīng)用于ServeMux實(shí)現(xiàn)全局日志記錄,完整示例代碼已驗(yàn)證可運(yùn)行,適用于中小型項(xiàng)目起步,擴(kuò)展建議包括捕獲狀態(tài)碼、支持JSON日志和請(qǐng)求ID追蹤。

See all articles