zoukankan      html  css  js  c++  java
  • 设计模式

    一、适配器模式

    适配器是两个接口的中间过度,比如电脑必须要保证电压在15V,而电源的电压是220V,则需要一个适配器将220V转换成15V,因此适配器就是接口的转换作用。

    interface Source{
        public int add(int a,int b);
    }
    class SourceImpl implements Source{
        public int add(int a,int b){
            return a+b;
        }
    }
    interface Target{
        public int addOne(int a);
    }
    class TargetImpl implements Target{
        private Source s ;
        public TargetImpl(Source s){
            this.s = s;
        }
        public int addOne(int a){
            return s.add(a,1);
        }
    }
    public class AdapterDemo{
        public static void main(String args[]){
            Source s = new SourceImpl();
            Target t = new TargetImpl(s);
            System.out.println("2+1="+t.addOne(2));
        }
    }

    二、定制服务模式

    定制服务的模式也可应用到面向对象的软件开发领域。当一个系统能对外提供多种类型的服务时,一种方式是粗粒度的接口,把所有的服务放在一个接口中声明,这个接口臃肿庞大,所有的使用者都访问同一个接口。还有一种方式就是设计精粒度接口,对服务精心分类,把相关的一组服务放在一个接口中,通过对接口的继承,可以派生出新的接口,针对使用者的需求提供特定的接口

    上表中的极速精英套餐SuperSpeedCombo和金融专网套餐FinanceCombo属于两种定制的服务接口,它们可以通过继承以上5个精粒度的接口而形成,这样的接口也称为复合接口。

    服务接口定制好以后,接下来的问题是如何实现这些接口。为了提高代码的可重用性,类的粒度也应该尽可能小,所以首先为精粒度的接口提供实现类。

    以下列出其中的一个服务实现类:

     

    public class BroadbandServiceImpl implements BroadbandService{
        private int speed;//网速
        public BroadbandServiceImpl(int speed){
            this.speed = speed;
        }
        //连接网络
        public void connect(String username,String password){...}
    
        //断开网络
        public void disconnect(){...}
    }

    同上,将精粒度的接口一一创建实现类,得到精粒度的类。

    那么对于SuperSpeedCombo 和 FinanceCombo 复合接口,如何实现它们呢?以 SuperSpeedCombo接口的实现类 SuperSpeedComboImpl为例,可以采用组合手段,复用 BroadbandService接口、VirusKillingService接口和MailboxService接口的实现类的程序代码。

    那么什么是组合关系呢?在这再复习一下,所谓的组合和继承都是提高代码可重用性的手段,继承最大的弱点就是破坏封装,子类和父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性,而组合关系不会破坏封装,整体类与局部类之间松耦合,彼此相互独立。当然组合关系也有缺点:创建整体类的对象时需要创建所有局部类的对象,而继承关系在创建子类的对象时无须创建父类的对象。

    比如要在SuperSpeedComboImpl采用组合手段加入宽带上网服务BroadbandService:

    此外,对于极速精英套餐和金融专网套餐,都有付费方式和价格这些属性,可以把这些属性放到同一个Payment中,这符合构建精粒度的对象模型的原则,下面是Payment的源程序:

    public class Payment{
        public static final String TYPE_PER_YEAR="按年付费";
        public static final String TYPE_PER_MONTH="按月付费";
        private String type;//付费方式
        private double price;//价格
        public Payment(String type, double price) {
            this.type = type;
            this.price = price;
        }
        //省略type属性和price属性的get/set方法
        ...
    }

    SuperSpeedComboImpl类的源程序如下:

    public class SuperSpeedComboImpl implements SuperSpeedCombo{
        private BroadbandServiceImpl BroadbandService;
        private VirusKillingService virusKillingService;
        private MailboxService mailboxService;
        private Payment payment;
        public SuperSpeedComboImpl(BroadbandServiceImpl broadbandService, VirusKillingService virusKillingService,
                MailboxService mailboxService, Payment payment) {
            super();
            BroadbandService = broadbandService;
            this.virusKillingService = virusKillingService;
            this.mailboxService = mailboxService;
            this.payment = payment;
        }
        public BroadbandServiceImpl getBroadbandService() {
            return BroadbandService;
        }
        public void setBroadbandService(BroadbandServiceImpl broadbandService) {
            BroadbandService = broadbandService;
        }
        public VirusKillingService getVirusKillingService() {
            return virusKillingService;
        }
        public void setVirusKillingService(VirusKillingService virusKillingService) {
            this.virusKillingService = virusKillingService;
        }
        public MailboxService getMailboxService() {
            return mailboxService;
        }
        public void setMailboxService(MailboxService mailboxService) {
            this.mailboxService = mailboxService;
        }
        public Payment getPayment() {
            return payment;
        }
        public void setPayment(Payment payment) {
            this.payment = payment;
        }
    }

    下面创建一个极速精英套餐服务的一个实例:

    //创建付费信息,按年付费,价格1555
    Payment payment = new Payment(Payment.TYPE_PER_MONTH,1555);
    
    //创建宽带上网服务,网速2Mbps
    BroadbandService broadbandService = new BroadbandServiceImpl(2);
    
    //创建邮箱服务,50MB容量
    MailboxService mailboxService = new MialboxServiceImpl(50);
    
    //创建在线杀毒服务
    VirusKillingService virusKillingService = new VirusKillingServiceImpl();
    
    //创建极速精英套餐服务
    SuperSpeedCombo superSpeedCombo = 
        new SuperSpeedComboImpl(broadbandService,mailboxService,virusKillingService,payment);
  • 相关阅读:
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 390 消除游戏
    Java实现 LeetCode 390 消除游戏
  • 原文地址:https://www.cnblogs.com/jingpeipei/p/5583549.html
Copyright © 2011-2022 走看看