java-設計模式

設計模式分為三類公23種:

1. 創建型模式:單例模式、簡單工廠模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。
2.結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
4.行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式。

1.單列模式

/**
 * 餓漢設計模式
 * @author xinchunyu
 * @CreateTime: 2019年9月23日 下午2:16:11 
 * @version V1.0
 */
public class Student {
    //私有化構造函數  讓外界不能創建對象
    private Student(){
      
    }
    private static Student instance = new Student();
    
    public static Student getInstance(){
        return instance;
    }
}

/**
 * 懶漢模式
 * @author xinchunyu
 * @CreateTime: 2019年9月23日 下午2:20:43 
 * @version V1.0
 */
public class Person {
    //私有化構造函數
    private Person(){
        
    }
    
    private static Person person = null;
    //為了解決安全問題加了同步
    public synchronized static Person getInstance(){
        if(person == null){
            person = new Person();
        }
        return person;
    }
}

2.簡單工廠模式

public abstract class Animal {
    public abstract void eat();
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨頭");
    }
}
/**
 * 簡單工廠
 * @author xinchunyu
 * @CreateTime: 2019年9月23日 下午2:44:15 
 * @version V1.0
 */
public class AnimalFactory {
    public AnimalFactory(){
        
    }
    //創建對象
    public static Animal createAnimal(String name){
        if("dog".equals(name)){
            return new Dog();
        }else if("cat".equals(name)){
            return new Cat();
        }
        return null;
    }
}

/**
 * 演示
 * @author xinchunyu
 * @CreateTime: 2019年9月23日 下午2:52:43 
 * @version V1.0
 */
public class AnimalDemo {
   public static void main(String[] args) {
    Dog dog = (Dog)AnimalFactory.createAnimal("dog");
    dog.eat();
    
    Cat cat = (Cat)AnimalFactory.createAnimal("cat");
    cat.eat();
    }
}

3.工廠方法模式

public abstract class Animal {
   abstract void eat();
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨頭");
    }
}
public interface AnimalFactory {
    Animal createAnimal();
}
//工廠方法
public class CatFactory implements AnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}
//工廠方法
public class DogFactory implements AnimalFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

4.抽象工廠模式

//電腦接口
public interface Computer {
  void sellMoney();
}
//手機接口
public interface Phone {
   void sellNum();
}
//蘋果的電腦實現類
public class AppleComputer implements Computer {
    @Override
    public void sellMoney() {
        System.out.println("蘋果電腦買10000元");
    }
}
//蘋果的手機實現類
public class ApplePhone implements Phone {
    @Override
    public void sellNum() {
    System.out.println("蘋果手機本月銷量500萬臺");
    }
}
//小米電腦接口實現類
public class XiaomiComputer implements Computer {
    @Override
    public void sellMoney() {
      System.out.println("小米電腦賣4999");
    }
}
//小米手機實現類
public class XiaomiPhone implements Phone {
    @Override
    public void sellNum() {
        System.out.println("小米本月賣了1000萬臺");
    }
}

//工廠接口
public interface Factory {
   Phone createPhone();
   Computer createComputer();
}
// apple電腦和手機的工廠實現類
public class AppleFactory implements Factory {

    @Override
    public Phone createPhone() {
        return new ApplePhone();
    }
    @Override
    public Computer createComputer() {
        return new AppleComputer();
    }
}
//小米工廠實現類
public class XiaomiFactory implements Factory {

    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }
    @Override
    public Computer createComputer() {
        return new XiaomiComputer();
    }
}
//演示類
public class Demo {

    public static void main(String[] args) {
        XiaomiFactory xf = new XiaomiFactory();
        XiaomiComputer xc = (XiaomiComputer) xf.createComputer();
        XiaomiPhone xp = (XiaomiPhone) xf.createPhone();
        xc.sellMoney();
        xp.sellNum();

        AppleFactory af = new AppleFactory();
        AppleComputer ac = (AppleComputer) af.createComputer();
        ApplePhone ap = (ApplePhone) af.createPhone();
        ac.sellMoney();
        ap.sellNum();
    }
}

適配器模式

//方法接口
public interface UserDao {
     
    void add();
    void update();
    void delete();
    void query();
}
//適配器模式     通過實現空方法為了讓UserDaoImpl 可以選擇性的重寫方法
public class UserAdapter implements UserDao {

    @Override
    public void add() {
    }
    @Override
    public void update() {
    }
    @Override
    public void delete() {
    }
    @Override
    public void query() {
    }
}
public class UserDaoImpl extends UserAdapter {
    @Override
    public void add() {
        System.out.println("執行了增加操作");
    }
}
//演示
public class UserDemo {

    public static void main(String[] args) {
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        userDaoImpl.add();
    }
}

1.裝飾者模式
裝飾者模式定義:在不改變原有對象的基礎上附加功能,相比生成子類更靈活。
適用場景:動態的給一個對象添加或者撤銷功能。
優點:可以不改變原有對象的情況下動態擴展功能,可以使擴展的多個功能按想要的順序執行,以實現不同效果。
缺點:更多的類,使程序復雜
類型:結構型。

/**
 * User 抽象組件
 * UserImpl 具體實現
 * Decorator 抽象裝飾者
 * SeeDecorator 具體裝飾者
 * DrinkDecorator 具體裝飾者
 */
//最高層抽象類
public interface User {
    void doEat();
}
//具體實現類
public class UserImpl implements User {
    @Override
    public void doEat() {
        System.out.println("正在吃著飯");
    }
}
//裝飾抽象類
public abstract class Decorator implements User{
    //很重要,組合抽象構件到自己的類中
    private User user;
    
    public Decorator(User user){
        this.user = user;
    }
    @Override
    public void doEat(){
        this.user.doEat();
    };
}
//裝飾具體類
public class DrinkDecorator extends Decorator{
    public DrinkDecorator(User user) {
        super(user);
    }
    @Override
    public void doEat() {
        super.doEat();
        System.out.println("還喝著水");
    }
}
//裝飾具體類
public class SeeDecorator extends Decorator {
    public SeeDecorator(User user) {
        super(user);
    }
    @Override
    public void doEat() {
        super.doEat();
        System.out.println("還看著電視");
    }
}

模板模式
定義:定義一個操作中的算法骨架,將一些步驟聲明為抽象方法迫使子類去實現。不同的子類可以以不同的方式實現這些抽象方法
簡單理解就是:將關鍵的業務方法、邏輯或算法封裝起來,而把具體的一些容易變化的步驟留給之類來進行具體不同的設置,具體表現就是實現了父類的方法

/**
 * MyTemplate 模板抽象類
 * CustomerDaoImpl 模板子類
 * StudentDaoImpl  模板子類
 * Demo 演示類
 */
//模板抽象類
public abstract class MyTemplate {
    //骨架不讓子類重寫
    public final void execute(){
        start();
        //用鉤子做判斷
        if(flag()){
            run();
        }
        end();
    }
    //在模板方法中有一種函數叫做鉤子函數,鉤子函數的作用是讓實現類可以通過一些方法來控制模板中的流程
    public abstract boolean flag();
    public abstract void run();
    public void start(){
        System.out.println("begin connection...");
    }
    public void end(){
        System.out.println("end connection...");
    }
}
//模板子類
public class CustomerDaoImpl extends MyTemplate {
    @Override
    public boolean flag() {
        return true;
    }
    @Override
    public void run() {
        System.out.println("操作用戶數據");
    }
}
//模板子類
public class StudentDaoImpl extends MyTemplate {
    @Override
    public boolean flag() {
        return false;
    }
    @Override
    public void run() {
        System.out.println("操作學生數據");   
    }
}
//演示類
public class Demo {
    public static void main(String[] args) {
        MyTemplate t1 = new CustomerDaoImpl();
        t1.execute();
        
        MyTemplate t2 = new StudentDaoImpl();
        t2.execute();
    }
}
//結果: 
//begin connection...
//操作用戶數據
//end connection...
//begin connection...
//end connection...

代理模式--靜態代理

/*
 * 靜態代理
 * BuyHouse 接口
 * BuyHouseImpl 接口實現類
 * BuyHouseProxy 代理類
 * Demo 演示類
 */
//接口
public interface BuyHouse {
    void doing();
}
//接口實現類
public class BuyHouseImpl implements BuyHouse {
    @Override
    public void doing() {
        System.out.println("正在買房。。。");
    }
}
//靜態代理類
public class BuyHouseProxy implements BuyHouse {

    private BuyHouse buyHouse;
    
    public BuyHouseProxy(BuyHouse buyHouse){
        this.buyHouse = buyHouse;
    }
    @Override
    public void doing() {
        System.out.println("開始買房");
        this.buyHouse.doing();
        System.out.println("買房結束");
    }
}
//演示類
public class Demo {
    public static void main(String[] args) {
        BuyHouseProxy bp = new BuyHouseProxy(new BuyHouseImpl());
        bp.doing();
    }
}
//結果: 
//開始買房
//正在買房。。。
//買房結束

代理模式--jdk動態代理

/**
 * jdk利用反射動態代理
 * BuyHouse 接口
 * BuyHouseImpl 接口實現類
 * DynamicInvocationHandler 代理實現類
 * Demo 演示類
 */
//接口
public interface BuyHouse {
   void doing();
}
//接口實現類
public class BuyHouseImpl implements BuyHouse {
    @Override
    public void doing() {
        System.out.println("正在買房。。。");
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//動態代理實現類
public class DynamicInvocationHandler implements InvocationHandler {

    private BuyHouse buyHouse;
    public DynamicInvocationHandler(BuyHouse buyHouse) {
        this.buyHouse = buyHouse;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("開始買房");
        Object invoke = method.invoke(buyHouse, args);
        System.out.println("買房結束");
        return invoke;
    }
}
import java.lang.reflect.Proxy;
//演示
public class Demo {
    public static void main(String[] args) {
        BuyHouse buyHouse = new BuyHouseImpl();
        DynamicInvocationHandler h = new DynamicInvocationHandler(buyHouse);
        BuyHouse b = (BuyHouse)Proxy.newProxyInstance(buyHouse.getClass().getClassLoader(), buyHouse.getClass().getInterfaces(), h);
        b.doing();
    }
}
//結果:
//開始買房
//正在買房。。。
//買房結束
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • 面試被人問到了設計模式,發現這方面知識漏洞還非常大,所以在這里記錄備忘一下。原文:https://blog.csd...
    onlyHalfSoul閱讀 499評論 0 2
  • 什么是設計模式 模式是在某情景下,針對某問題的某種解決方案。模式必然應用于一個重復出現的問題。問題包括了一個目標和...
    liaowenhao閱讀 1,503評論 0 6
  • 極客學院-23 種設計模式 Java之美[從菜鳥到高手演變]之設計模式Java之美[從菜鳥到高手演變]之設計模式 ...
    John13閱讀 2,852評論 0 0
  • 本文說明:本文章只簡單敘述設計模式,而且僅僅從理論上簡單敘述,僅此而已?。。?本文摘自網絡,純粹復制粘貼,不喜可以...
    Ling912閱讀 675評論 1 5
  • 還沒細細看花,沒淋一場雨,春已去,某年一定要再江南等一場雨。“風住塵香花已盡”,好在春意都在詩詞里了,多少人都只想...
    草芊芊閱讀 210評論 1 0