触碰大师们的思想(二)之 策略模式

如果说,简单工厂模式是创造对象的黑箱盒子(它将创造对象实例的操作封装起来,把操作从客户类中解放出来,客户无需知道工厂是怎样创建的,只要在需要实例的时候调用工厂给的接口方法就可以),那么策略模式就是封装同系列方法的黑箱盒子。
策略模式,针对变化点(策略的变化)进行封装,利用策略实现类们共同的父类,将同系列的方法(策略)在策略容器里统一,通过容器来调度各个策略,客户端只需要使用策略容器的接口方法就可以使用策略了。

我觉得这两个设计模式的设计思路比较相像,
简单工厂模式里,工厂类利用实例们的共同的父类封装他们各自创建实例的行为,但因为它要返回对象,所以客户端需要声明一个类来承接工厂结果(需要:父类+静态工厂类)。
策略模式里,策略容器类利用策略实现类们共同的父类来整合策略,策略通常是一种行为,所以客户端直接使用容器就可以完成使用策略(需要:容器类)。

策略模式实例
上次车生产好了,这次开始卖车了。
从客户的角度出发——买车策略有两个,一个是通过4S店买,一个是通过车站买。

package myDesignPattern02;

策略之父,买车策略:

public abstract class CarStrategy {
    //抽象方法,规定买车策略统一方法
    public abstract void anyWayToBuyCar();
}

买车策略A:

public class CarStrategyA extends CarStrategy{
    //实现A的买车策略
    @Override
    public void anyWayToBuyCar() {
        System.out.println("A->通过4S店买车。");
    }
}

买车策略B:

public class CarStrategyB extends CarStrategy{
    //实现B的买车策略
    @Override
    public void anyWayToBuyCar() {
        System.out.println("B->通过车展直接买车。");
    }
}

买车策略模式核心——买车策略容器:

public class BuyCarContext {

    private CarStrategy x;
    //容器中使用构造器来注入需要的某个策略,实现多个策略选一的整合调度
    public BuyCarContext(String str) {
        try {
            this.x = (CarStrategy) Class.forName("myDesignPattern02." + str).newInstance();
        } catch (Exception e) {
            System.out.println("非法途径啊~");
        }
    }
    //提供对外策略接口
    public void BuyCar() {
        x.anyWayToBuyCar();
    }

}

客户要开始买车了,询问专业人士:

import java.util.Scanner;

public class Client {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("少年,你想买车?我给你两个建议。CarStrategyA||CarStrategyB");
        String str = null;
        BuyCarContext bcc=null;
        while (sc.hasNext()) {
            str = sc.nextLine();    
            try {
                bcc=new BuyCarContext(str);
                bcc.BuyCar();
            } catch (Exception e) {
                System.out.println("你得是打错了"+e.getMessage());
            }
        }

    }

代码运行效果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您可以使用 HTML 和 CSS 实现一个光标触碰到就可以下拉的级菜单。以下是一个简单的示例: HTML 代码: ```html <div class="dropdown"> <button class="dropbtn">菜单</button> <div class="dropdown-content"> <a href="#">菜单项1</a> <a href="#">菜单项2</a> <a href="#">菜单项3</a> <div class="dropdown-submenu"> <a href="#">菜单项4 ▶</a> <div class="dropdown-submenu-content"> <a href="#">子菜单项1</a> <a href="#">子菜单项2</a> <a href="#">子菜单项3</a> </div> </div> </div> </div> ``` CSS 代码: ```css .dropdown { position: relative; display: inline-block; } .dropdown-content { display: none; position: absolute; z-index: 1; } .dropdown .dropbtn:hover + .dropdown-content, .dropdown-content:hover { display: block; } .dropdown-submenu { position: relative; } .dropdown-submenu-content { display: none; position: absolute; top: 0; left: 100%; margin-top: -1px; z-index: 1; } .dropdown-submenu:hover > .dropdown-submenu-content { display: block; } .dropbtn { background-color: #4CAF50; color: white; padding: 12px; font-size: 16px; border: none; } .dropdown-content a { color: black; padding: 12px 16px; text-decoration: none; display: block; } .dropdown-content a:hover { background-color: #f1f1f1; } .dropdown-submenu-content a { color: black; padding: 8px 16px; text-decoration: none; display: block; } .dropdown-submenu-content a:hover { background-color: #ddd; } ``` 在这个示例中,我们使用了 `position` 属性将菜单项的子菜单定位在父菜单项的右侧,并使用了 `display: none` 属性将子菜单默认隐藏。当鼠标悬停在父菜单项上时,使用 CSS 选择器将子菜单显示出来。 请注意,这只是一个简单的示例,您可以根据自己的需求对其进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值