Padrão de estratégia e classes internas

  • Caso de banco
package com.uncle.strategy.src.bank;

/**
 * 内部类
 * 	   指的是在Java中可以将一个类定义在另一个类的内部
 * 	   内部类可以定义在  类的内部 (与类成员层次一致)
 * 	   内部类可以定义在  方法/块内部 (与类成员相差一个层次  方法的局部变量一个层次)
 * 	LinkedBox   Node内部类
 *
 * 	*1.成员内部类
 * 		将一个类直接定义在类的里面,作为成员,与属性或方法层次一致
 * 		成员内部类可以与正常类一样 使用不同的修饰符来修饰
 * 		好处1.省略了一个.java文件  好处2.成员内部类中可以访问外部类的所有成员 包括私有的
 * 		若想要在内部类中通过对象.调用外部类成员   外部类.this.外部类成员;
 * 		内部类存在后 源代码进行编译 产生一个字节码  Demo$InnerDemo.class
 * 	2.局部内部类
 * 		将一个类定义在方法/块里面,作为成员的内部结构,与临时的局部变量一个层次
 * 		局部内部类像是一个局部的变量一样,不能用public protected private及static
 * 		只能用abstract或final
 * 		局部内部类命名规则Demo$1InnerTestMethod   Demo$2InnerTestMethod
 * 		局部内部类使用的变量只能是final修饰
 * 	*3.匿名内部类
 * 		成员匿名内部类
 * 		局部匿名内部类
 * 		public interfase Test{
 * 			public void test();
 *                }
 * 		Test t = new Test(){
 * 			public void test(){
 *            }
 *        };
 * 		通常接口或抽象类的具体子类这样写
 * 		开发中为了省略一个类文件   上述写法比较常见
 * 		匿名内部类很特殊 只有类体 没有类的所有结构( 修饰符 名字 继承 实现)
 * 		不能用任何修饰符来修饰  匿名内部类也没有构造方法
 * 		Swing  做一个按钮 绑定一个事件监听器
 * 	4.静态内部类
 * 		成员静态内部类
 * 		不需要外部类对象,通过正常的方式直接创建内部类
 * 		静态元素不能访问非静态成员(自己类和外部类)
 */
public class Test {
    
    
    public static void main(String[] args){
    
    
        Bank bank = new Bank();
        Person p = new OldMan("长者");
        bank.profession(p);//银行欢迎长者进来办理业务

//        Person p = new YoungMan("年轻人");
//        bank.profession(p);

//        Person p = new Toff("土豪");
//        bank.profession(p);

        //按照刚才的设计 可能有问题
        //1.三个不同的人类方法名不一致(可以)
        //2.银行办理业务的方法写了三个
        //解决如上所述的问题   可以在三个人类之上创建一个父类
        //1.解决三个人类中的相同代码 比如name属性 比如get方法之类的
        //2.父类定义的三个方法可以是抽象 解决了子类命名不一致的问题 子类执行也不一致
        //3.父类可以作为参数传入银行
    }
}

package com.uncle.strategy.src.bank;

public class Bank {
    
    

    //开门 等待用户进来办理业务
    public void profession(Person person){
    
    
        System.out.println(person.getName()+"客户进入银行啦");
        person.callNumber();
        person.transact();
        person.leave();
    }

}

package com.uncle.strategy.src.bank;

public class OldMan extends Person{
    
    

    public OldMan(){
    
    }
    public OldMan(String name){
    
    
        this.name=name;
    }
    //1.进银行 叫一个号码 排队
    public void callNumber(){
    
    
        System.out.println("年事已高 不知道在哪儿叫号 请求大堂经理的帮忙");
    }
    //2.去窗口办理
    public void transact(){
    
    
        System.out.println("到窗口 掏出手绢儿 拿出存折 取钱");
    }
    //3.办理完毕离开啦
    public void leave(){
    
    
        System.out.println("办理完毕 慢慢的离开啦");
    }

}

package com.uncle.strategy.src.bank;

public abstract class Person {
    
    
    protected String name;
    public String getName(){
    
    
        return this.name;
    }
    //1.进银行 叫一个号码 排队
    public abstract void callNumber();
    //2.去窗口办理
    public abstract void transact();
    //3.办理完毕离开啦
    public abstract void leave();
}

package com.uncle.strategy.src.bank;

public class Toff extends Person{
    
    

    public Toff(){
    
    }
    public Toff(String name){
    
    
        this.name=name;
    }
    //1.进银行 叫一个号码 排队
    public void callNumber(){
    
    
        System.out.println("我是土豪我有钱 不需要叫号排队 直接进入VIP窗口");
    }
    //2.去窗口办理
    public void transact(){
    
    
        System.out.println("我是土豪我有钱 甩一张限量黑卡 取1000W 买车");
    }
    //3.办理完毕离开啦
    public void leave(){
    
    
        System.out.println("帅气的提着一袋子钱离开啦");
    }
}

package com.uncle.strategy.src.bank;

public class YoungMan extends Person{
    
    

    public YoungMan(){
    
    }
    public YoungMan(String name){
    
    
        this.name=name;
    }
    //1.进银行 叫一个号码 排队
    public void callNumber(){
    
    
        System.out.println("自己知道在门口按按钮 拿到号码小票");
    }
    //2.去窗口办理
    public void transact(){
    
    
        System.out.println("去窗口 汇款");
    }
    //3.办理完毕离开啦
    public void leave(){
    
    
        System.out.println("办理完迅速离开啦");
    }
}

  • Classe interna anônima
package com.uncle.strategy.src.innerclass;


public class TestMain {
    
    
    public static void main(String[] args){
    
    
        //内部类属于外部类的(相当于是一个成员) 需要外部类对象才能操作
        //创建内部类的对象---调用内部类的方法
        Demo demo = new Demo();
        Demo.InnerDemo innerDemo = demo.new InnerDemo();
        //调用内部类的方法
        innerDemo.testInnerDemo();

        //静态的成员内部类
        //InnerDemoStatic ids = new InnerDemoStatic();
    }
}

package com.uncle.strategy.src.innerclass;

public class Demo {
    
    
    private String name = "这是正常类中的属性";
    public void testDemo(){
    
    
        System.out.println("这是正常类中的方法");
    }
    public void testDemoOne(){
    
    
        String s = "";
        //定义一个局部内部类
        class InnerTestMethod{
    
    
            //局部内部类中使用的局部变量都需要加final修饰
        }
    }
    public void testDemoTwo(){
    
    
        String s;
        //定义一个局部内部类
        class InnerTestMethod{
    
    

        }
    }

    //成员内部类
    public class InnerDemo{
    
    
        private String name="我是内部类的属性";
        public void testInnerDemo(){
    
    
            System.out.println("我是成员内部类的方法:"+this.name);
            Demo.this.testDemo();
        }
    }

    private static class InnerDemoStatic{
    
    

    }

}


Acho que você gosta

Origin blog.csdn.net/m0_51945027/article/details/112798287
Recomendado
Clasificación