夜光带你走进 Java 成神之路(六)擅长的领域

夜光序言:

 

 

又下雨了,如果你在眼前,我可能会说,我恨你,如果你不在,我更想说,我想你了。

 

 

 

 

 

 

 

 

正文:

                           以道御术 / 以术识道

 

 

 

 

package 开闭原则;

public class Ocp {
    public static void main(String[] args) {

        //使用看看,存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());

    }
}

//下面写一个用于绘图的类
class GraphicEditor{
    //夜光:接收shape对象,然后来绘制不同的图形
    public void drawShape(Shape s){
           if (s.m_type == 1)
               drawRectangle(s);
           else if(s.m_type == 2)
               drawCircle(s);
    }

    public void drawRectangle(Shape r){
        System.out.println(" 绘制矩形");
    }

    public void drawCircle(Shape r){
        System.out.println(" 绘制圆形");
    }
}

//这里,我们定义了一个Shape类,基类
class Shape{
    int m_type;
}

class Rectangle extends Shape{
    Rectangle(){
        super.m_type = 1;
    }
}


class Circle extends Shape{
    Circle(){
        super.m_type = 2;
    }
}






 

 

package 开闭原则;

public class Ocp {
    public static void main(String[] args) {

        //使用看看,存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }
}

//下面写一个用于绘图的类
class GraphicEditor{
    //夜光:接收shape对象,然后来绘制不同的图形
    public void drawShape(Shape s){
           if (s.m_type == 1)
               drawRectangle(s);
           else if(s.m_type == 2)
               drawCircle(s);
           else if(s.m_type == 3)
               drawTriangle(s);
    }

    //绘制矩形
    public void drawRectangle(Shape r){
        System.out.println(" 绘制矩形");
    }

    //绘制圆形
    public void drawCircle(Shape r){
        System.out.println(" 绘制圆形");
    }

    //绘制圆形
    public void drawTriangle(Shape r){
        System.out.println(" 绘制三角形");
    }
}

//这里,我们定义了一个Shape类,基类
class Shape{
    int m_type;
}

class Rectangle extends Shape{
    Rectangle(){
        super.m_type = 1;
    }
}


class Circle extends Shape{
    Circle(){
        super.m_type = 2;
    }
}

//新增画三角形
class Triangle extends Shape{
    Triangle(){
        super.m_type = 3;
    }
}





 

 

 

package 开闭原则.分析;

public class Ocp {
    public static void main(String[] args) {

        //使用看看,存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
        graphicEditor.drawShape(new OtherGraphic());
    }
}

//下面写一个用于绘图的类
class GraphicEditor{
    //夜光:接收shape对象,然后来绘制不同的图形
    public void drawShape(Shape s){
              s.draw();
    }

}

//这里,我们定义了一个Shape类,基类
//定义为抽象方法
abstract class Shape{
    int m_type;

    public abstract void draw();  //抽象方法
}

class Rectangle extends Shape {
    Rectangle(){
        super.m_type = 1;
    }

    @Override
    public void draw() {

        System.out.println("绘制矩形");
    }
}


class Circle extends Shape {
    Circle(){
        super.m_type = 2;
    }

    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

//新增画三角形
class Triangle extends Shape {
    Triangle(){
        super.m_type = 3;
    }

    @Override
    public void draw() {
        System.out.println("绘制三角形");
    }
}

//其他图形
class OtherGraphic extends Shape{
    OtherGraphic(){
        super.m_type = 4;
    }

    @Override
    public void draw() {
        System.out.println("绘制其他图形");
    }
}



 

 

 

 

 

 

 

在方法前边写:/+快捷键名+Tab键。

即可,比如我设置的快捷键方法名是a

package 迪米特法则;


import java.util.ArrayList;
import java.util.List;

//夜光:写一个类来介绍一下迪米特法则
//客户端
public class Demeter {

    public static void main(String[] args) {
        //new一个对象
        SchoolManager schoolManager = new SchoolManager();
        //调用其方法
        schoolManager.printAllEmployee(new CollegeManager()); //传入一个对象CollegeManager

    }
}

//学校总部员工
class Employee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//学院的员工
class CollegeEmployee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}


//我们写一个类
//管理学院员工的管理类
class CollegeManager{
    //返回学院的所有员工
    /**
    * @Description:
    * @Param: []
    * @return: java.util.List<迪米特法则.CollegeEmployee>
    * @Author: Hy
    * @Date: 2019/11/28
    */
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();

        for (int i = 0; i < 10; i++) { //这里我们增加十个员工到list
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id= " + i);
            list.add(emp);
        }
        return list;
    }
}





class SchoolManager{
    /**
    * @Description:
    * @Param: []
    * @return: java.util.List<迪米特法则.Employee>
    * @Author: Hy
    * @Date: 2019/11/28
    */
    public List<Employee> getAllEmployee() {
         List<Employee> list = new ArrayList<Employee>();

         for(int i=0;i<5;i++){  //这里我们增加五个员工到list
             Employee emp = new Employee();
             emp.setId("学院总部员工id= " + i);
             list.add(emp);
         }
         return list;
    }




    /**
    * @Description: 该方法完成输出学校总部和学院员工信息
    * @Param: [sub]
    * @return: void
    * @Author: Hy
    * @Date: 2019/11/28
    */
    void printAllEmployee(CollegeManager sub){

        List<CollegeEmployee> list1 = sub.getAllEmployee();

        System.out.println("----------------------分公司员工-------------------------");

        for(CollegeEmployee e : list1){
            System.out.println(e.getId());
        }

        List<Employee> list2 = this.getAllEmployee();
        System.out.println("-------------------学校总部员工-------------------------");
        for(Employee e : list2){
            System.out.println(e.getId());
        }
    }
}

package 迪米特法则.improve;


import java.util.ArrayList;
import java.util.List;

//夜光:写一个类来介绍一下迪米特法则
//客户端
public class Demeter {

    public static void main(String[] args) {
        System.out.println("使用迪米特法则之后的改进~~~");
        //new一个对象
        SchoolManager schoolManager = new SchoolManager();
        //调用其方法
        //输出了学院总部的员工id 和 学院的员工id
        schoolManager.printAllEmployee(new CollegeManager()); //传入一个对象CollegeManager

    }
}

//学校总部员工
class Employee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

//学院的员工
class CollegeEmployee{
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}


//我们写一个类
//管理学院员工的管理类
class CollegeManager{
    //返回学院的所有员工
    /**
    * @Description:
    * @Param: []
    * @return: java.util.List<迪米特法则.CollegeEmployee>
    * @Author: Hy
    * @Date: 2019/11/28
    */
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();

        for (int i = 0; i < 10; i++) { //这里我们增加十个员工到list
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id= " + i);
            list.add(emp);
        }
        return list;
    }

    //输出学院员工的信息
    public void printEmployee(){
/*        List<CollegeEmployee> list1 = sub.getAllEmployee();*/
        List<CollegeEmployee> list1 = this.getAllEmployee();
        System.out.println("----------------------分公司员工-------------------------");

        for(CollegeEmployee e : list1){
            System.out.println(e.getId());
        }

    }


}


//夜光:我们来分析一下
//分析SchoolManager的直接朋友有哪些 Employee(成员变量)、CollegeManager
//CollegeEmployee不是直接的朋友,这样违背了迪米特法则
class SchoolManager{

    /**
    * @Description:
    * @Param: []
    * @return: java.util.List<迪米特法则.Employee>
    * @Author: Hy
    * @Date: 2019/11/28
    */
    public List<Employee> getAllEmployee() {
         List<Employee> list = new ArrayList<Employee>();

         for(int i=0;i<5;i++){  //这里我们增加五个员工到list
             Employee emp = new Employee();
             emp.setId("学院总部员工id= " + i);
             list.add(emp);
         }
         return list;
    }




    /**
    * @Description: 该方法完成输出学校总部和学院员工信息
    * @Param: [sub]
    * @return: void
    * @Author: Hy
    * @Date: 2019/11/28
    */
    void printAllEmployee(CollegeManager sub){

       /* 分析问题
       * 1. 这里的CollegeEmployee 不是 SchoolManager 的直接朋友
       * 2. CollegeEmployee 是以局部变量的方式出现在 SchoolManager
       * 3. 违反了迪米特法则
       * */

       //解决方案,将输出学院的员工的方法,封装到CollegeManager
/*        List<CollegeEmployee> list1 = sub.getAllEmployee();

        System.out.println("----------------------分公司员工-------------------------");

        for(CollegeEmployee e : list1){
            System.out.println(e.getId());
        }*/
        sub.printEmployee();

        List<Employee> list2 = this.getAllEmployee();
        System.out.println("-------------------学校总部员工-------------------------");
        for(Employee e : list2){
            System.out.println(e.getId());
        }
    }
}

 

迪米特法则核心就是降低类之间的耦合

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值