【java面试】---设计模式(简单模式、抽象工厂、策略模式、装饰模式)

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

类图:

此是简单工厂模式:

主要逻辑:

1.创建一个所有类的一个公共接口

2.所有具体类去实现此接口

3.创建一个和client通信的一个类,实现一个方法,返回值为接口类型

 

步骤 1

创建一个接口。

Shape.java

步骤 2

创建实现接口的实体类。

Rectangle.java

 

Square.java

 

Circle.java

 

步骤 3

创建一个工厂,生成基于给定信息的实体类的对象。

ShapeFactory.java

步骤 4

使用该工厂,通过传递类型信息来获取实体类的对象。

FactoryPatternDemo.java

 

步骤 5

验证输出。

 

抽象工厂模式:

主要逻辑:

1.抽象某几个公共的接口

2.实现他们的自己工厂

3.实现工厂抽象工厂对每个工厂进行抽象

4.实现工厂的创建

5.client去操作工厂的创建

步骤 1

为形状创建一个接口。

Shape.java

 

步骤 2

创建实现接口的实体类。

Rectangle.java

 

Square.java

 

Circle.java

 

步骤 3

为颜色创建一个接口。

Color.java

 

步骤4

创建实现接口的实体类。

Red.java

 

Green.java

 

Blue.java

 

步骤 5

为 Color 和 Shape 对象创建抽象类来获取工厂。

AbstractFactory.java

 

步骤 6

创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。

ShapeFactory.java

 

ColorFactory.java

 

步骤 7

创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。

FactoryProducer.java

 

步骤 8

使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。

AbstractFactoryPatternDemo.java

 

步骤 9

验证输出。

策略模式:

定义一系列的算法, 将其一个个封装起来, 并使它们可相互替换, 使得算法可独立于使用它的客户而变化. 


 

public class Context {



    private Strategy strategy;



    public void setStrategy(Type type, double... args) {

        if (type == Type.NORMAL) {

            strategy = new Normal();

        } else if (type == Type.DISCOUNT) {

            strategy = new Discount(args[0]);

        } else if (type == Type.REBATE) {

            strategy = new Rebate(args[0], args[1]);

        }

    }



    public double getResult(double money) {

        return strategy.acceptCash(money);

    }



    public enum Type {

        NORMAL(0, "正常"),

        DISCOUNT(1, "打折"),

        REBATE(2, "返利");



        private int value;



        private String desc;



        Type(int value, String desc) {

            this.value = value;

            this.desc = desc;

        }

    }

}

装饰模式:

1.Component,抽象方法-买手机

public abstract class AbstractBuyPhone {
   //主要是向父母提出想买手机的意向
   public  abstract  void  BuyPhone();
  //父母是否同意
   public  abstract  void   Agree();
}

2.ConcreteComponent:具体的意向

public class XiaoMingBuyPhone extends  AbstractBuyPhone {
   @Override
   public void BuyPhone() {
       Log.d("qzs","我想买一款华为的5000元的手机");
   }

   @Override
   public void Agree() {
       Log.d("qzs","父母同意了");
   }
}

3.Decorator,增加一个装饰抽象类,方便修饰

public class XiaoMingBuyPhone extends  AbstractBuyPhone {
   @Override
   public void BuyPhone() {
       Log.d("qzs","我想买一款华为的5000元的手机");
   }

   @Override
   public void Agree() {
       Log.d("qzs","父母同意了");
   }
}

3.Decorator,增加一个装饰抽象类,方便修饰

public class AbstractDecorator extends AbstractBuyPhone {
   private  AbstractBuyPhone abstractBuyPhone;

   public  AbstractDecorator ( AbstractBuyPhone abstractBuyPhone){
       this.abstractBuyPhone=abstractBuyPhone;
   }

   @Override
   public void BuyPhone() {
     this.abstractBuyPhone.BuyPhone();
   }

   @Override
   public void Agree() {
       this.abstractBuyPhone.Agree();
   }
}

4.ConcreteDecorator:如果直接去找父母要手机,很容易被拒绝,所以需要修饰一下,这里用成绩修饰一下

public class ScoreDecortator extends AbstractDecorator {

   public ScoreDecortator(AbstractBuyPhone abstractBuyPhone) {
       super(abstractBuyPhone);
   }

   //先和父母说说自己的成绩
   private  void  ShowScore(){
       Log.d("qzs","我这次考试的成绩年级前三,又进步了");
   }
  //重写买手机的方法,先汇报成绩,然后再提买手机的事情
   @Override
   public void BuyPhone() {
       this.ShowScore();
       super.BuyPhone();
   }
}

5.调用,也就是请求父母:

        AbstractBuyPhone str;
       //小明的原本意向
        str=new XiaoMingBuyPhone();
        //修饰后的意向
        str=new ScoreDecortator(str);
        //向父母提出想法(成绩和买手机)
        str.BuyPhone();
        //父母同意了
        str.Agree();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值