设计模式

简单的介绍几种设计模式

单例模式:懒汉式:

public class Entrance {
  public static void main(String[] args) {
    // 单例模式中的懒汉式
    Person person1 = Person.getPerson();
    Person person2 = Person.getPerson();
    System.out.println(person1 == person2);
  }


}


class Person {
  private static Person p = null;


  private Person() {
  }


  public static Person getPerson() {
    if (p == null) {
      p = new Person();
    }
    return p;
  }
}
  • 优点:只有在第一次使用的时候创建空间,否则这辈子都不会创建了

  • 缺点:线程不安全,多线程时,会发生非单例情况,可以加synchronnized锁,但加锁会影响效率

单例模式中的饿汉式:

class Student{
  private static Student s = new Student();
  private Student() {}
  public static Student getStudent() {
    return s;
  }
}
  • 优点:线程安全

  • 缺点:类加载时就创建空间,浪费资源

工厂模式:

interface Phone{
  public void make();
}


class Mi implements Phone{
  @Override
  public void make() {
    System.out.println("小米在制造手机");
  }


  @Override
  public String toString() {
    return "Mi";
  }
  
}
class Iphone implements Phone{
  @Override
  public void make() {
    System.out.println("苹果正在制造手机");
  }
}
class MakeFactory{
  public static Phone makePhone(String nameString) {
    if(nameString.equals("小米")) {
      return new Mi();
    }
    if(nameString.equals("苹果")) {
      return new Iphone();
    }
    return null;
  }
}


适配器模式:

public class Entrance {
  public static void main(String[] args) {
    
    Person person = new Person();
    person.chi();
    Dog dog = new Dog();
    dog.sa();
    
  }
}


/**
 * 适配器模式
 * @author 曹
 *
 */
interface make{
  public void chi();
  public void he();
  public void la();
  public void sa();
  public void shui();
  //............
}
/**
 * 适配器类,用来实现接口的所有方法
 * @author 曹
 *
 */
class Adapter implements make{


  @Override
  public void chi() {
    // TODO Auto-generated method stub
    
  }


  @Override
  public void he() {
    // TODO Auto-generated method stub
    
  }


  @Override
  public void la() {
    // TODO Auto-generated method stub
    
  }


  @Override
  public void sa() {
    // TODO Auto-generated method stub
    
  }


  @Override
  public void shui() {
    // TODO Auto-generated method stub
    
  }
  
}
class Person extends Adapter{


  @Override
  public void chi() {
    System.out.println("人只有吃方法");
  }


  @Override
  public void he() {
    System.out.println("人只有喝方法");
  }


  @Override
  public void la() {
    System.out.println("人只有拉方法");
  }
  
}
class Dog extends Adapter{


  @Override
  public void sa() {
    System.out.println("狗只有撒方法");
  }


  @Override
  public void shui() {
    System.out.println("狗只有睡方法");
  }
  
}

代理模式:静态代理:由一个代理主题操作真实主题

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


    wangtong wangtong = new wangtong(new dianxin());
    wangtong.make();


  }
}


interface NetWork {
  public void make();
}


/**
 * 真实代理
 * 
 * @author 曹
 *
 */
class dianxin implements NetWork {


  @Override
  public void make() {
    System.out.println("上网浏览信息");
  }
}


/**
 * 代理主题
 * 
 * @author 曹
 *
 */
class wangtong implements NetWork {


  private NetWork net;


  public wangtong(NetWork net) {
    this.net = net;
  }


  private void test() {
    System.out.println("这是网通的其他业务");
  }


  @Override
  public void make() {
    test();
    net.make();
  }
}

建造者模式:

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


    CreateRoubt createRoubt = new CreateRoubt();
    Roubt roubt = createRoubt.createRoubtSpeak(new Service());
    System.out.println(roubt);
  }


}


/**
 * 创建一个复杂对象
 * 
 * @author 曹
 *
 */
class Roubt {
  private String headString;
  private String bodyString;
  private String handString;
  private String rootString;


  public String getHeadString() {
    return headString;
  }


  public void setHeadString(String headString) {
    this.headString = headString;
  }


  public String getBodyString() {
    return bodyString;
  }


  public void setBodyString(String bodyString) {
    this.bodyString = bodyString;
  }


  public String getHandString() {
    return handString;
  }


  public void setHandString(String handString) {
    this.handString = handString;
  }


  public String getRootString() {
    return rootString;
  }


  public void setRootString(String rootString) {
    this.rootString = rootString;
  }


  @Override
  public String toString() {
    return "Roubt [headString=" + headString + ", bodyString=" + bodyString + ", handString=" + handString
        + ", rootString=" + rootString + "]";
  }


}


/**
 * 规范复杂对象的各个组成成分的建造
 * 
 * @author 曹
 *
 */
interface BuilderRoubt {
  public void builderHead();


  public void builderBody();


  public void builderHand();


  public void builderFoot();


  public Roubt createRoubt();
}


/**
 * 复杂对象的表现
 * 
 * @author 曹
 *
 */
class Service implements BuilderRoubt {


  private Roubt roubt;


  public Service() {
    this.roubt = new Roubt();
  }


  @Override
  public void builderHead() {
    roubt.setHeadString("强大的头脑");
  }


  @Override
  public void builderBody() {
    roubt.setBodyString("苗条的身材");
  }


  @Override
  public void builderHand() {
    roubt.setHandString("手指很灵活");
  }


  @Override
  public void builderFoot() {
    roubt.setRootString("双脚很光滑");
  }


  @Override
  public Roubt createRoubt() {
    return roubt;
  }


}


/**
 * 对复杂对象进行构建
 * 
 * @author 曹
 *
 */
class CreateRoubt {
  public Roubt createRoubtSpeak(BuilderRoubt roubt) {
    roubt.builderBody();
    roubt.builderFoot();
    return roubt.createRoubt();
  }
}
public class Entrance {
  public static void main(String[] args) {


    // 去肯德基,汉堡、可乐、薯条、炸鸡等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
    // 套餐一:
    QingKfc taocanyi = new QingKfc();
    KFCcontent kfCcontent = taocanyi.createKfCcontentLa(new TasteLa());
    System.out.println(kfCcontent);
    // 套餐二:
    DuanKFC taocaner = new DuanKFC();
    KFCcontent kfCcontent2 = taocaner.createCcontent(new TasteSuan());
    System.out.println(kfCcontent2);
  }


}


/**
 * 这是一个复杂对象,克的及店内所有食物
 * 
 * @author 曹
 *
 */
class KFCcontent {
  private String hanbaoString;
  private String keleString;
  private String shutiaoString;
  private String zhajiString;


  public String getHanbaoString() {
    return hanbaoString;
  }


  public void setHanbaoString(String hanbaoString) {
    this.hanbaoString = hanbaoString;
  }


  public String getKeleString() {
    return keleString;
  }


  public void setKeleString(String keleString) {
    this.keleString = keleString;
  }


  public String getShutiaoString() {
    return shutiaoString;
  }


  public void setShutiaoString(String shutiaoString) {
    this.shutiaoString = shutiaoString;
  }


  public String getZhajiString() {
    return zhajiString;
  }


  public void setZhajiString(String zhajiString) {
    this.zhajiString = zhajiString;
  }


  @Override
  public String toString() {
    return "KFCcontent [hanbaoString=" + hanbaoString + ", keleString=" + keleString + ", shutiaoString="
        + shutiaoString + ", zhajiString=" + zhajiString + "]";
  }


}


/**
 * 复杂对象的各个组成成分的建造
 * 
 * @author 曹
 *
 */
interface Builder {
  public void builderHanbao();


  public void builderKele();


  public void builderShutiao();


  public void builderZhaji();


  public KFCcontent creKfCcontent();
}


/**
 * 变现特性:麻辣
 * 
 * @author 曹
 *
 */
class TasteLa implements Builder {


  private KFCcontent kfc;


  public TasteLa() {
    this.kfc = new KFCcontent();
  }


  @Override
  public void builderHanbao() {
    kfc.setHanbaoString("BT辣");
  }


  @Override
  public void builderKele() {
    kfc.setKeleString("酒精可乐");
  }


  @Override
  public void builderShutiao() {
    kfc.setShutiaoString("五项麻辣");
  }


  @Override
  public void builderZhaji() {
    kfc.setZhajiString("麻辣");
  }


  @Override
  public KFCcontent creKfCcontent() {
    return kfc;
  }


}


/**
 * 表现特性二:酸甜
 * 
 * @author 曹
 *
 */
class TasteSuan implements Builder {


  private KFCcontent kfc;


  public TasteSuan() {
    this.kfc = new KFCcontent();
  }


  @Override
  public void builderHanbao() {
    kfc.setHanbaoString("酸爽");
  }


  @Override
  public void builderKele() {
    kfc.setKeleString("柠檬可乐");
  }


  @Override
  public void builderShutiao() {
    kfc.setShutiaoString("柔软酸爽");
  }


  @Override
  public void builderZhaji() {
    kfc.setZhajiString("醋香鸡腿");
  }


  @Override
  public KFCcontent creKfCcontent() {
    return kfc;
  }


}


/**
 * 创建具体表现的对象一
 * 
 * @author 曹
 *
 */
class QingKfc {
  public KFCcontent createKfCcontentLa(TasteLa la) {
    la.builderHanbao();
    la.builderKele();
    la.builderShutiao();
    la.builderZhaji();
    return la.creKfCcontent();
  }
}


/**
 * 创建具体表现对象二
 * 
 * @author 曹
 *
 */
class DuanKFC {
  public KFCcontent createCcontent(TasteSuan suan) {
    suan.builderHanbao();
    suan.builderKele();
    suan.builderShutiao();
    suan.builderZhaji();
    return suan.creKfCcontent();
  }
}

门面模式:

public class Entrance {
  public static void main(String[] args) {
    //门面模式:一个流程拍一个队。
    MenMian menMian = new MenMian();
    menMian.shangwu();
    menMian.xiawu();
  }


}
/**
 * 第一个门面
 * @author 曹
 *
 */
class Computer{
  public void upJava() {
    System.out.println("等待Java上");
  }
  public void downJava() {
    System.out.println("等待Java下课");
  }
  
}
/**
 * 第二个门面
 * @author 曹
 *
 */
class Food{
  public void downToast() {
    System.out.println("等待吐丝下课");
  }
  public void upToast() {
    System.out.println("等待吐丝上课");
  }
}
/**
 * 结束吃饭
 * @author 曹
 *
 */
class Canteen{
  public void startEat() {
    System.out.println("开始吃饭");
  }
  public void endEat() {
    System.out.println("结束吃饭");
  }
}
/**
 * 设计一个门面类
 * @author 曹
 *
 */
class MenMian{
  private Computer computer;
  private Food food;
  private Canteen canteen;
  public MenMian() {
    computer=new Computer();
    food=new Food();
    canteen=new Canteen();
  }
  /**
   * 上午流程
   */
  public void shangwu() {
    computer.upJava();
    food.upToast();
    canteen.startEat();
  }
  /**
   * 下午流程
   */
  public void xiawu() {
    canteen.endEat();
    food.upToast();
    computer.upJava();
    computer.downJava();
  }
}

桥接模式:是通过抽象化和实现化的方式进行解耦,使得二者互不相连,独立变化,因为此时A和B没有任何直接关系。

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


    A1 a1 = new A1();//来源地
    a1.qiao=new B1();//目的地,父类的引用指向了子类的对象
    a1.fromA();
    a1.qiao.ObjB();
  }
}


/**
 * 简历一个桥接
 * 
 * @author 曹
 *
 */
interface Qiao {
  public void ObjB();
}


abstract class A {
  public Qiao qiao;


  abstract void fromA();
}


/**
 * 目的地1
 * 
 * @author 曹
 *
 */
class B1 implements Qiao {
  @Override
  public void ObjB() {
    System.out.println("我要去B1");
  }
}


/**
 * 目的地2
 * 
 * @author 曹
 *
 */
class B2 implements Qiao {


  @Override
  public void ObjB() {
    System.out.println("我要去b2");


  }
}


/**
 * 目的地3
 * 
 * @author 曹
 *
 */
class B3 implements Qiao {
  @Override
  public void ObjB() {
    System.out.println("我要去b3");


  }
}
/**
 * 来源地一
 * @author 曹
 *
 */
class A1 extends A {


  @Override
  void fromA() {
    System.out.println("我来自a1");
  }
}
/**
 * 来源地二
 * @author 曹
 *
 */
class A2 extends A {


  @Override
  void fromA() {
    System.out.println("我来自a2");


  }
}
/**
 * 来源地三
 * @author 曹
 *
 */
class A3 extends A {


  @Override
  void fromA() {
    System.out.println("我来自a3");


  }
}

观察者模式--又称做发布--订阅模式:

public class Entrance {
  public static void main(String[] args) {
    B b = new B();
    b.addObserver(new A());
    b.addObserver(new C());
    b.modify(10);
  }
}
/**
 * 定义一个发布者,也就是被观察者 ,需要实现Java中的Observable接口
 * @author 曹
 *
 */
class B extends Observable{
  int data=20;
  public void modify(int data) {
    this.data = data;
    setChanged();//自动调用 标记发布者的数据改变了
    notifyObservers("我改变了"+this.data);//订阅者updat方法中的实参  ,参数作为update方法中arg的实参   
  }
}
/**
 * 定义一个观察者,也就是订阅者,当发布者改变的时候,当发布者被改变后,订阅者中的update方法会被自动执行
 * @author 曹
 *
 */
class A implements Observer{
  @Override
  public void update(Observable o, Object arg) {//o是B的对象,arg为B传进来的参数
    System.out.println(o+"我改变了"+arg);
  }
}
class C implements Observer{
  @Override
  public void update(Observable o, Object arg) {//o是B的对象,arg为B传进来的参数
    System.out.println(o+"我改变了"+arg);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值