4种设计模式

1、工厂设计模式

package objects;

/*
*   工厂模式
*       降低使用者和被使用者之间的依赖:比如被使用者改变了可能会使得使用者报错
*       (原理:通过建立新的工厂类,创建返回父类的方法,参数为子类的名字,具体的返回为实现的子类-多态)
* */
public class FactroyPattern {
    public static void main(String[] args) {
        product phone1 = productFactory.getProduct("phone");
        if (phone1!=null){
            phone1.making();
        }
    }
}

//使用工厂
class productFactory{
    public static product getProduct(String name){
        if ("phone".equals(name)){
            return new phone();
        } else if ("tv".equals(name)) {
            return new tv();
        }else {
            return null;
        }
    }
}


abstract class product{
    abstract public void making();
}
class phone extends product{
    public void making(){
        System.out.println("正在制造手机");
    }
}
class tv extends product{
    public void making(){
        System.out.println("正在制造电视");
    }
}

2、适配器模式

package objects;

/*
*   适配器:
*   (某个方法需要确定的某个类型的接口A,但是现在想要匹配另一种接口B,所以建立适配器类实现接口A,
*   在适配器类中定义新接口属性B,并初始化;在适配器类的实现方法中,传入B的功能。)
*
* */
public class AdapterPattern {
    public static void main(String[] args) {
        //例子1
        animalMethod dog = new dog();
        dog.eat();
        System.out.println("----------");
        //例子2
        EarPhoneTYPEC c = new typec();
        UseEarPhone(c);//使用手机本来的TypeC接口
        System.out.println("----------");
        //-----------------------------------
        //UseEarPhone(old35); //出错,手机不支持3.5mm耳机
        //使用适配器
        EarPhoneOld35 old35 = new Old35();
        Adapter adapter = new Adapter(old35);
        UseEarPhone(adapter);
    }
    //手机仅支持TypeC接口!
    public static void UseEarPhone(EarPhoneTYPEC c){
        System.out.println("请插入耳机...");
        c.insert();
        System.out.println("插入完成...");
    }
}


//1、例子
interface animal{
    public void eat();
    public void shot();
}
// 适配器:通过建立方法和接口一样的抽象类,用子类继承抽象类,就不用实现所有接口中的方法
abstract class animalMethod{
    public void eat(){};
    public void shot(){};
}
class dog extends animalMethod{
    //狗不会开枪,所以如果直接实现接口(需要实现所有行为)会浪费
    public void eat(){
        System.out.println("小狗吃骨头");
    }
}

//2、例子
//适配器:通过建立新的类实现手机支持的TypeC接口,类中定义3.5mm耳机属性
class Adapter implements EarPhoneTYPEC{
    private EarPhoneOld35 old35;
    public Adapter(EarPhoneOld35 old35) {
        this.old35 = old35;
    }
    public void insert(){
        old35.insert();
    }
}

// TypeC接口的耳机
interface EarPhoneTYPEC{
    public void insert();
}
class typec implements EarPhoneTYPEC{
    public void insert(){
        System.out.println("成功插入TypeC口耳机");
    }
}
// 3.5mm的耳机
interface EarPhoneOld35{
    public void insert();
}
class Old35 implements EarPhoneOld35{
    public void insert(){
        System.out.println("成功插入3.5mm耳机");
    }
}

3、代理模式

package objects;

/*
*   静态代理模式
*       为其他对象提供一种代理来控制对这个对象的访问
*       (原理:子类和代理子类继承同一个类或接口,在代理子类中创建使用父类引用属性(组合),重写父类方法,
*       传参的时候可以传入子类)
* */
public class ProxyPattern {
    public static void main(String[] args) {
        proxyWork user1 = new proxyWork(new userWork());
        user1.doWork();
    }
}

//代理类也继承父类
class proxyWork implements work{
    private work target; //被代理的对象(使用接口引用,方便多态)
    //构造函数初始化
    public proxyWork(work target){
        this.target = target;
    }
    //重写
    public void doWork(){
        //这里举例使用检查工作时间
        long beginTime = System.currentTimeMillis();
        target.doWork();
        long endTime = System.currentTimeMillis();
        System.out.println("工作时长:"+(endTime-beginTime));
    }

}

interface work{
    public void doWork();
}
class userWork implements work{
    public void doWork(){
        System.out.println("用户开始干活...");
    }
}

4、策略模式

package objects;

/*
*   策略模式
*       定义一系列算法,将每一种算法封装起来并且可以相互替换使用
*       让算法独立于他的客户应用而独立变化
*       一个接口多个实现,可以按运行时需求替换,可维护性变强,新增接口不会影响其它实现类
*   (原理:定义接口及其实现,定义抽象类并在其中创建接口属性,然后实例化接口(构造函数或set),
*    在类方法中调用接口的方法。在psvm中,创建抽象类的子对象,仅需调用类方法,通过实例化的时候,
*    传入不同类型的接口实现类,就可以实现不同的功能。)
* */
public class StrategyPattern {
    public static void main(String[] args) {
        BaseService user01 = new userServie();//多态
        user01.setIsave(new NetSave());//初始化,只需更改这里的参数就实现不同的功能
        user01.add("data");
    }
}
//把可变的行为抽象出来,定义的一系列算法(i.e.一个接口,多个实现)
interface ISave{
    abstract void save(String data);
}
class FileSave implements ISave{
     public void save(String data){
        System.out.println("保存到文件中..."+data);
    }
}
class NetSave implements ISave{
    public void save(String data) {
        System.out.println("保存到网页中..."+data);
    }
}
//
abstract class BaseService{
    //使用组合
    private ISave isave;
    //初始化,这里使用set方法
    public void setIsave(ISave isave){
        this.isave = isave;
    }
    public void add(String data){
        System.out.println("检测数据合法性...");
        isave.save(data);
        System.out.println("保存成功");
    }
}
class userServie extends BaseService{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值