常见设计模式(带通俗解释)

单例模式 
简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。单例模式实现起来也很容易,直接看demo吧


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

按照我的习惯,我恨不得写满注释,怕你们看不懂,但是这个代码实在太简单了,所以我没写任何注释,如果这几行代码你都看不明白的话,那你可以洗洗睡了,等你睡醒了再来看我的博客说不定能看懂。

观察者模式 
对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。Android中的各种Listener就使用到了这一设计模式,只要用户对手机进行操作,对应的listener就会被通知,并作出响应的处理。

看不懂图的人端着小板凳到这里来,给你举个栗子��:假设有三个人,小美,老王和老李。小美很漂亮,老王和老李都暗恋小美,时刻关注着小美的一举一动。有一天,小美说了一句:我一个人好无聊啊~~~,这句话被老王和老李听到了,结果没一会儿,他们就想约她出去玩。 
在这里,小美是被观察者,老王和老李是观察者,被观察者发出一条信息,然后被观察者进行相应的处理,看代码:

public interface Person {
    //老王和老李通过这个接口可以接收到小美发过来的消息
    void getMessage(String s);
}

 

这个接口相当于老王和老李的电话号码,小美发送通知的时候就会拨打getMessage这个电话,拨打电话就是调用接口,看不懂没关系,先往下看

public class LaoWang implements Person {
 
    private String name = "老王";
 
    public LaoWang() {
    }
 
    @Override
    public void getMessage(String s) {
        System.out.println(name + "接到了小美打过来的电话,电话内容是:" + s);
    }
 
}
 
public class LaoLi implements Person {
 
    private String name = "老李";
 
    public LaoLi() {
    }
 
    @Override
    public void getMessage(String s) {
        System.out.println(name + "接到了小美打过来的电话,电话内容是:->" + s);
    }
 
}

代码很简单,我们再看看小美的代码:

public class XiaoMei {
    List<Person> list = new ArrayList<Person>();
     public XiaoMei(){
     }
 
     public void addPerson(Person person){
         list.add(person);
     }
 
     //遍历list,把自己的通知发送给所有暗恋自己的人
     public void notifyPerson() {
         for(Person person:list){
             person.getMessage("今天就我一个人,你们过来吧!");
         }
     }
}

我们写一个测试类来看一下结果对不对

public class Test {
    public static void main(String[] args) {
 
        XiaoMei xiao_mei = new XiaoMei();
        LaoWang lao_wang = new LaoWang();
        LaoLi lao_li = new LaoLi();
 
        //老王和老李在小美那里都注册了一下
        xiao_mei.addPerson(lao_wang);
        xiao_mei.addPerson(lao_li);
 
        //小美向老王和老李发送通知
        xiao_mei.notifyPerson();
    }
}

运行结果我截图了 

完美~~~

装饰者模式 
对已有的业务逻辑进一步的封装,使其增加额外的功能,如java中的IO流就使用了装饰者模式,用户在使用的时候,可以任意组装,达到自己想要的效果。 
举个栗子,我想吃三明治,首先我需要一根大大的香肠,我喜欢吃奶油,在香肠上面加一点奶油,再放一点蔬菜,最后再用两片面包加一下,很丰盛的一顿午饭,营养又健康,那我们应该怎么来写代码呢? 
首先,我们需要写一个Food类,让其他所有食物都来继承这个类,看代码:

public class Food {
 
    private String food_name;
 
    public Food() {
    }
 
    public Food(String food_name) {
        this.food_name = food_name;
    }
 
    public String make() {
        return food_name;
    };
}

代码很简单,我就不解释了,然后我们写几个子类继承它:


//面包类
public class Bread extends Food {
 
    private Food basic_food;
 
    public Bread(Food basic_food) {
        this.basic_food = basic_food;
    }
 
    public String make() {
        return basic_food.make()+"+面包";
    }
}
 
//奶油类
public class Cream extends Food {
 
    private Food basic_food;
 
    public Cream(Food basic_food) {
        this.basic_food = basic_food;
    }
 
    public String make() {
        return basic_food.make()+"+奶油";
    }
}
 
//蔬菜类
public class Vegetable extends Food {
 
    private Food basic_food;
 
    public Vegetable(Food basic_food) {
        this.basic_food = basic_food;
    }
 
    public String make() {
        return basic_food.make()+"+蔬菜";
    }
 
}

这几个类都是差不多的,构造方法传入一个Food类型的参数,然后在make方法中加入一些自己的逻辑,如果你还是看不懂为什么这么写,不急,你看看我的Test类是怎么写的,一看你就明白了


public class Test {
    public static void main(String[] args) {
        Food food = new Bread(new Vegetable(new Cream(new Food("香肠"))));
        System.out.println(food.make());
    }
}

看到没有,一层一层封装,我没从里往外看:最里面我new了一个香肠,在香肠的外面我包裹了一层奶油,在奶油的外面我又加了一层蔬菜,最外面我放的是面包,是不是很形象,哈哈�� 这个设计模式简直跟现实生活中一摸一样,看懂了吗? 
我们看看运行结果吧 

一个三明治就做好了~~~

适配器模式 
将两种完全不同的事物联系到一起,就像现实生活中的变压器。假设一个手机充电器需要的电压是20V,但是正常的电压是220V,这时候就需要一个变压器,将220V的电压转换成20V的电压,这样,变压器就将20V的电压和手机联系起来了。


public class Test {
    public static void main(String[] args) {
        Phone phone = new Phone();
        VoltageAdapter adapter = new VoltageAdapter();
        phone.setAdapter(adapter);
        phone.charge();
    }
}
 
// 手机类
class Phone {
 
    public static final int V = 220;// 正常电压220v,是一个常量
 
    private VoltageAdapter adapter;
 
    // 充电
    public void charge() {
        adapter.changeVoltage();
    }
 
    public void setAdapter(VoltageAdapter adapter) {
        this.adapter = adapter;
    }
}
 
// 变压器
class VoltageAdapter {
    // 改变电压的功能
    public void changeVoltage() {
        System.out.println("正在充电...");
        System.out.println("原始电压:" + Phone.V + "V");
        System.out.println("经过变压器转换之后的电压:" + (Phone.V - 200) + "V");
    }
}

工厂模式 
简单工厂模式:一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象的接口

// 抽象产品类
abstract class Car {
    public void run();
 
    public void stop();
}
 
// 具体实现类
class Benz implements Car {
    public void run() {
        System.out.println("Benz开始启动了。。。。。");
    }
 
    public void stop() {
        System.out.println("Benz停车了。。。。。");
    }
}
 
class Ford implements Car {
    public void run() {
        System.out.println("Ford开始启动了。。。");
    }
 
    public void stop() {
        System.out.println("Ford停车了。。。。");
    }
}
 
// 工厂类
class Factory {
    public static Car getCarInstance(String type) {
        Car c = null;
        if ("Benz".equals(type)) {
            c = new Benz();
        }
        if ("Ford".equals(type)) {
            c = new Ford();
        }
        return c;
    }
}
 
public class Test {
 
    public static void main(String[] args) {
        Car c = Factory.getCarInstance("Benz");
        if (c != null) {
            c.run();
            c.stop();
        } else {
            System.out.println("造不了这种汽车。。。");
        }
 
    }
 
}

工厂方法模式:有四个角色,抽象工厂模式,具体工厂模式,抽象产品模式,具体产品模式。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品

// 抽象产品角色
public interface Moveable {
    void run();
}
 
// 具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}
 
public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}
 
// 抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}
 
// 具体工厂
public class PlaneFactory extends VehicleFactory {
    public Moveable create() {
        return new Plane();
    }
}
 
public class BroomFactory extends VehicleFactory {
    public Moveable create() {
        return new Broom();
    }
}
 
// 测试类
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}

抽象工厂模式:与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的工厂生产多个产品

/抽象工厂类
public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}
//具体工厂类,其中Food,Vehicle,Weapon是抽象类,
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();
    }
}
//测试类
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();
    }
}

文章转自:https://blog.csdn.net/Wu_Ming0821/article/details/51838078

设计模式讲的比较简洁明了的还有

https://blog.csdn.net/qq_33706840/article/details/81631762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值