Java設(shè)計開發(fā)模式

java開發(fā)設(shè)計模式
java開發(fā)設(shè)計模式2

  1. 單例模式

    是一種常用的軟件設(shè)計模式,在它的核心結(jié)構(gòu)中值包含一個被稱為單例的特殊類。一個類只有一個實例栖袋,即一個類只有一個對象實例益缎。

    package design.pattern;

    public class Singleton {

        private static Singleton singleton;

        private Singleton() {}

        public static Singleton getInstance() {

            if (singleton == null) {

                synchronized (Singleton.class) {

                    singleton = new Singleton();

                }

            }

            return singleton;

        }

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
  1. 工廠模式

    根據(jù)需要返回我們的對象签孔。應(yīng)用比較熟悉的場景就是spring配置文件了绪囱。

    package design.pattern;

    public class MyFactory {

    public static final int TYPE_MI = 1;// 大米

    public static final int TYPE_YU = 2;// 油

    public static final int TYPE_SC = 3;// 蔬菜

    public static Food getFoods(int foodType) {

    switch (foodType) {

    case TYPE_MI:

    return new DaMi();

    case TYPE_YU:

    return new You();

    case TYPE_SC:

    default:

    return new ShuCai();

    }

    }

    }

    abstract class Food {

    }

    class DaMi extends Food {

    }

    class You extends Food {

    }

    class ShuCai extends Food {

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
  1. 適配器模式

    將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口另假。通俗地講绪抛,就是在2個類之間做了一個銜接资铡。比如你在調(diào)用A類的doSomething方法,實際上內(nèi)部實現(xiàn)調(diào)用了B類的doSomething方法幢码。

    package design.pattern;

    public class MyAdapter {

    private MyAdapterImpl adapterImpl;

    public MyAdapter(MyAdapterImpl myAdapterImpl) {

    this.adapterImpl = myAdapterImpl;

    }

    public void doSomething() {

    adapterImpl.doSomething();

    }

    public static void main(String args[]) {

    new MyAdapter(new MyAdapterImpl()).doSomething();

    }

    }

    class MyAdapterImpl {

    public void doSomething() {

    }

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
  1. 代理模式

    它的定義是:代理模式給某一個對象提供一個代理對象笤休,并由代理對象控制對原對象的引用。Java的反射機制症副,很多地方就用了代理模式來實現(xiàn)店雅。

    package design.pattern;

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

    import java.lang.reflect.Proxy;

    public class DynamicProxyMain {

    public static void main(String[] args) {

    Person smallPerson = new Child();

    Person proxyBuyHouse = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),

    new Class[] { Person.class }, new DynamicProxyHandler(smallPerson));

    proxyBuyHouse.eat();

    }

    }

    interface Person {

    void eat();

    }

    class Child implements Person {

    @Override

    public void eat() {

    // 小孩吃什么

    System.out.println("eating");

    }

    }

    class DynamicProxyHandler implements InvocationHandler {

    private Object object;

    public DynamicProxyHandler(final Object object) {

    this.object = object;

    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    System.out.println("調(diào)用前日志監(jiān)控");

    Object result = method.invoke(object, args);

    System.out.println("調(diào)用后日志監(jiān)控");

    return result;

    }

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
  1. 監(jiān)聽模式

    當(dāng)事件源觸發(fā)某種行為,會自動執(zhí)行事件監(jiān)聽器里面相應(yīng)的方法贞铣。

    Java監(jiān)聽模式右三個部分組成:事件源闹啦、事件對象、事件監(jiān)聽器辕坝。

    package design.pattern;

    public class ListenerTest {

    public static void main(String[] args) {

    MyListener myListener = new MyListener();

    MyPerson person = new MyPerson();

    person.addEatListener(myListener);

    person.eat();

    }

    }

    //事件源

    class MyPerson{

    private Listener listener;//監(jiān)聽器引用

    //給事件源添加監(jiān)聽器

    public void addEatListener(Listener listener) {

    this.listener = listener;

    }

    public void eat() {

    //吃了很多

    if(listener != null) {

    Event event=new Event() ;

    event.setPerson(this);

    listener.isThinking(event);//監(jiān)聽吃飯時窍奋,想了什么

    }

    }

    }

    //事件

    class Event {

    private MyPerson person;// 事件源的引用

    public MyPerson getPerson() {

    return person;

    }

    public void setPerson(MyPerson person) {

    this.person = person;

    }

    }

    interface Listener {

    public void isThinking(Event event);

    }

    class MyListener implements Listener {

    @Override

    public void isThinking(Event event) {

    System.out.println(" is isThinking many things !");

    }

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
  1. 裝飾器模式

    簡單說就是不改變現(xiàn)有類的結(jié)構(gòu)前提下,擴展它的功能。用別的類來增加原有類的功能琳袄。

    package design.pattern;

    public class MyDecorator {

    public static void main(String[] args) {

    Animal animal= new SmallDog(new Pet());

    animal.eat();

    }

    }

    interface Animal {

    public void eat();

    }

    class Pet implements Animal {

    @Override

    public void eat() {

    System.out.println("eat food");

    }

    }

    class Dog implements Animal{

    protected Animal animal;

    public Dog(Animal animal) {

    this.animal = animal;

    }

    @Override

    public void eat() {

    this.animal.eat();

    }

    }

    class SmallDog extends Dog{

    public SmallDog(Animal animal) {

    super(animal);

    }

    public void eat() {

    System.out.println("eat other food ");

    this.animal.eat();

    }

    }
java開發(fā)中常用的幾種設(shè)計模式及代碼例子
java開發(fā)中常用的幾種設(shè)計模式及代碼例子

設(shè)計模式的六大原則

1江场、開閉原則(Open Close Principle)

開閉原則就是對功能擴展開放,對修改代碼關(guān)閉窖逗。系統(tǒng)擴展功能是址否,不需要修改原來的代碼,只需新增代碼便可碎紊。

2佑附、里氏代換原則(Liskov Substitution Principle)

里氏代換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計的基本原則之一。 里氏代換原則中說矮慕,能使用父類的地方一定可以使用子類替代。 LSP是繼承復(fù)用的基石啄骇,里氏代換原則是對“開-閉”原則的補充痴鳄。

3、依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)

是開閉原則的基礎(chǔ)缸夹,具體內(nèi)容:實現(xiàn)接口編程痪寻,依賴于抽象類或接口而不依賴于具體類,系統(tǒng)功能擴展時可以使用具體類擴展虽惭。

4橡类、接口隔離原則(Interface Segregation Principle)

使用多個隔離的接口,比使用單個接口要好芽唇,原則是:降低依賴顾画,降低耦合。

5匆笤、迪米特法則(最少知道原則)(Demeter Principle)

最少知道原則研侣,就是說:一個實體應(yīng)當(dāng)盡量少的與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立炮捧。

6庶诡、合成復(fù)用原則(Composite Reuse Principle)

原則是盡量使用合成/聚合的方式,而不是使用繼承咆课。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末末誓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子书蚪,更是在濱河造成了極大的恐慌喇澡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殊校,死亡現(xiàn)場離奇詭異撩幽,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門窜醉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪萄,“玉大人,你說我怎么就攤上這事榨惰“萦ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵琅催,是天一觀的道長居凶。 經(jīng)常有香客問我,道長藤抡,這世上最難降的妖魔是什么侠碧? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缠黍,結(jié)果婚禮上弄兜,老公的妹妹穿的比我還像新娘。我一直安慰自己瓷式,他們只是感情好替饿,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贸典,像睡著了一般视卢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廊驼,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天据过,我揣著相機與錄音,去河邊找鬼妒挎。 笑死蝶俱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饥漫。 我是一名探鬼主播榨呆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庸队!你這毒婦竟也來了积蜻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤彻消,失蹤者是張志新(化名)和其女友劉穎竿拆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宾尚,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡丙笋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年谢澈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御板。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锥忿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怠肋,到底是詐尸還是另有隱情敬鬓,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布笙各,位于F島的核電站钉答,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杈抢。R本人自食惡果不足惜数尿,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惶楼。 院中可真熱鬧右蹦,春花似錦、人聲如沸鲫懒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窥岩。三九已至,卻和暖如春宰缤,著一層夾襖步出監(jiān)牢的瞬間颂翼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工慨灭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朦乏,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓氧骤,卻偏偏與公主長得像呻疹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筹陵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354