JavaRush /Java блогы /Random-KK /Деңгей 37. Деңгейлік тақырып бойынша сұхбат сұрақтарына ж...
lichMax
Деңгей
Санкт-Петербург

Деңгей 37. Деңгейлік тақырып бойынша сұхбат сұрақтарына жауаптар

Топта жарияланған
Сәлеметсіз бе. Қайтадан бұл сұрақтарға жауап таба алмадым. Мен өзім үшін құрастырған жауаптарымды жариялауды шештім. 37-деңгей. Деңгей тақырыбы бойынша сұхбат сұрақтарына жауаптар – 1Міне, өзекті сұрақтар: Сұхбатқа арналған сұрақтар:
  1. Дизайн үлгілері дегеніміз не?
  2. Қандай дизайн үлгілерін білесіз?
  3. Singleton үлгісі туралы айтып беріңізші? Оны қалай қауіпсіз етуге болады?
  4. Зауыт үлгісі туралы айтып беріңізші?
  5. AbstractFactory үлгісі туралы айтып беріңіз
  6. Adaper үлгісі, оның орауыштан айырмашылығы туралы айтып беріңізші?
  7. Прокси үлгісі туралы айтып беріңіз
  8. Итератор дегеніміз не? Итераторға қатысты қандай интерфейстерді білесіз?
  9. Бізге Arrays класы не үшін қажет?
  10. Бізге «Жинақтар» сыныбы не үшін қажет?
Міне менің жауаптарым: Менің жауаптарым:
  1. Дизайн үлгілері - бұл бағдарламаларды немесе олардың бөліктерін жобалау және әзірлеу кезінде пайда болатын ең көп таралған мәселелердің жақсы бекітілген, сәтті шешімдері.

  2. Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy, Bridge, MVC.

  3. Бағдарламада болуы үшін сыныптың бір ғана данасы қажет болғанда, үлгі пайдаланылады Singleton. Бұл келесідей көрінеді (жалқау инициализация):

    clas Singleton {
    	private Singleton instance;
    
    	private Singleton() {}
    
    	public static Singletot getInstance() {
    		if (instance == null)
    			instance = new Singleton();
    		return instance;
    	}
    }

    getInstance()Оны қауіпсіз ету үшін әдіске модификатор қосуға болады synchronized. Бірақ бұл ең жақсы шешім емес (бірақ ең қарапайым). getInstanceӘлдеқайда жақсы шешім - әдісті осылай жазу (екі рет тексерілген құлыптау):

    public static synchronized Singleton getInstance() {
    	if (instance == null)
    		synchronized(Singleton.class) {
    			instance = new Singleton();
    		}
    	return instance;
    }

  4. Үлгі Factory– генеративті үлгі. Ол сұраныс бойынша an objectілерді құруға мүмкіндік береді (мысалы, белгілі бір жағдайларда). Бұл келесідей көрінеді:

    class Factory{
    	public static Object1 getObject1() {
    		return new Object1();
    	}
    
    	public static Object2 getObject2() {
    		return new Object2();
    	}
    
    	public static Object3 getObject3() {
    		return new Object3();
    	}
    }

    Бұл үлгінің деп аталатын нұсқасы да бар FactoryMethod. Осы үлгі бойынша кіріс деректеріне (параметр мәндеріне) байланысты бір әдісте әртүрлі an objectілер құрылады. Барлық осы нысандардың ортақ ата-тегі (немесе ортақ іске асырылатын интерфейс) болуы керек. Бұл келесідей көрінеді:

    class FactoryMethod {
    	public enum TypeObject {
    		TYPE1,
    		TYPE2,
    		TYPE3
    	}
    
    	public static CommonClass getObject(TypeObject type) {
    		switch(type) {
    			case TYPE1:
    				return new Object1();
    			case TYPE2:
    				return new Object2();
    			case TYPE3:
    				return new Object3();
    			default:
    				return null;
    		}
    	}
    }

    Сыныптар Object1және Object2сыныптан Object3мұра CommonClass.

  5. Үлгі Abstract Factoryде генеративті дизайн үлгісі болып табылады. Осы үлгі бойынша бірнеше бетон зауыттары үшін шаблон қызметін атқаратын абстрактілі фабрика құрылады. Міне, мысал:

    class Human {}
    
    class Boy extends Human {}
    class TeenBoy extends Human {}
    class Man extends Human {}
    class OldMan extends Human {}
    
    class Girl extends Human {}
    class TeenGirl extends Human {}
    class Woman extends Human {}
    class OldWoman extends Human {}
    
    interface AbstractFactory {
    	Human getPerson(int age);
    }
    
    class FactoryMale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Boy();
    		if (age >= 12 && age <= 20)
    			return new TeenBoy();
    		if (age > 20 && age < 60)
    			return new Man();
    		return new OldMan();
    	}
    }
    
    сlass FactoryFemale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Girl();
    		if (age >= 12 && age <= 20)
    			return new TeenGirl();
    		if (age > 20 && age < 60)
    			return new Woman();
    		return new OldWoman();
    	}
    }

  6. Үлгі Adapter– құрылымдық үлгі. Оның орындалуы бір түрдегі нысанды басқа түрдегі an object қажет болған жағдайда (әдетте дерексіз түрлер) пайдалануға мүмкіндік береді. Бұл үлгіні іске асыру мысалы:

    interface TotalTime {
    	int getTotalSeconds();
    }
    interface Time {
    	int getHours();
    	int getMinutes();
    	int getSeconds();
    }
    
    class TimeAdapter extends TotalTime {
    	private Time time;
    	public TimeAdapter(Time time) {
    		this.time = time;
    	}
    	public int getTotalTime() {
    		return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60;
    	}
    }
    
    class TotalTimeAdapter extends Time {
    	private TotalTime totalTime;
    	public TotalTimeAdapter(TotalTime totalTime) {
    		this.totalTime = totalTime;
    	}
    
    	public int getSeconds() {
    		return totalTime % 60;
    	}
    
    	public int getMinutes() {
    		return (totalTime / 60) % 60;
    	}
    
    	public int getHours() {
    		return totaltime/ (60 * 60) ;
    	}
    }
    
    class Main {
    	public static void main(String[] args) {
    		Time time = new Time() {
    			public int getSeconds() {
    				return LocalTime.now().getSecond();
    			}
    
    			public int getMinutes() {
    				return LocalTime.now().getMinute();
    			}
    
    			public int getHours() {
    				return LocalTime.now().getHour() ;
    			}
    		};
    
    		TotalTime totalTime = new TimeAdapter(time);
    		System.out.println(totalTime.getTotalSeconds());
    
    		TotalTime totalTime2 = new TotalTime() {
    			public int getTotalSeconds() {
    				LocalTime currTime = LocalTime.now();
    				return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60;
    			}
    		};
    
    		Time time2 = new TotalTimeAdapter(totalTime2);
    		System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds());
    	}
    }

    При реализации паттерна Wrapper создаётся класс, который оборачивает исходный класс и реализует тот же интерфейс, который реализует исходный класс. Таким образом, это позволяет расширить функциональность исходного класса и использовать новый класс там, где ожидается использование исходного класса. Это отличается от реализации паттерна Adapter тем, что в данном случае используется один интерфейс (тот же, что есть у исходного класса). В паттерне Adapter же используется два интерфейса, и класс, который оборачивает экземпяр исходного класса, реализует совсем другой инферфейс, не интерфейс исходного класса.

  7. Паттерн Proxy — это структурный паттерн проектирования. Он нужен для того, чтобы контролировать доступ к Howому-то an objectу. Для этого пишется класс по типу "обёртка", то есть внутрь класса передаётся исходный an object, реализующий некий интерфейс, сам класс тоже реализует этот интерфейс, и в каждом методе этого класса вызывается похожий метод у исходного an object. Реализация того же интерфейса, что и у исходного an object, позволяет подменить исходный an object прокси-an objectом. Также это позволяет, не меняя исходного an object, "навешивать" на его методы Howую-то специальную дополнительную функциональность (например, логирование, проверка прав доступа, кэширование и т.д.). Пример:

    interface Bank {
    	void setUserMoney(User user, double money);
    	double getUserMoney(User user);
    }
    
    class CitiBank implements Bank { //оригинальный класс
    	public void setUserMoney(User user, double money) {
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		UserDAO.getUserMoney(user);
    	}
    }
    
    class SecurityProxyBank implements Bank {
    	private Bank bank;
    
    	public SecurityProxyBank(Bank bank) {
    		this.bank = bank;
    	}
    
    	public void setUserMoney(User user, double money) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't change money value");
    
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't get money value");
    
    		UserDAO.getUserMoney(user);
    	}

  8. Итератор — это специальный внутренний an object коллекции, который позволяет последовательно перебирать элементы этой коллекций. Этот an object должен реализовывать интерфейс Iterator<E>, либо ListIterator<E> (для списков). Также, для того, чтобы перебирать элементы коллекции, коллекция должна поддерживать интерфейс Iterable<E>. Интерфейс Iterable<E> содержит всего один метод — iterator(), который позволяет извне получить доступ к итератору коллекции.

    Интерфейс Iterator<E> содержит следующие методы:

    • boolean hasNext() — проверяет, есть ли в коллекции ещё Howой-то элемент

    • E next() — позволяет получить очередной элемент коллекции (после получения element, внутренний курсор итератора передвигается на следующий элемент коллекции)

    • void remove() — удаляет текущий элемент из коллекции

    Интерфейс же ListIterator<E> содержит такие методы:

    • boolean hasNext() — проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим)

    • E next() — возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент)

    • int nextIndex() — возвращает индекс следующего element

    • void set(E e) — устанавливает meaning текущего element void add(E e). Добавляет элемент в конец списка.

    • boolean hasPrevious() — проверяет, существует ли Howой-то элемент в коллекции перед данным элементом

    • E previous() — возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции

    • int previousIndex — возвращает индекс предыдущего element коллекции

    • void remove() — удаляет текущий элемент коллекции

    • void add(E e) — добавляет элемент e после текущего element коллекции

  9. Класс Arrays- массивтердің әртүрлі манипуляцияларына арналған утorталар класы. Бұл класта массивті тізімге айналдыру, массив бойынша іздеу, массивті көшіру, массивтерді салыстыру, массив хэшcodeын алу, массивті жол ретінде көрсету және т.б. әдістері бар.

  10. Класс Collections– жинақтармен жұмыс істеуге арналған пайдалы сынып. Бұл сыныпта жинаққа элементтер қосу, коллекцияны элементтермен толтыру, жинақты іздеу, жинақты көшіру, жинақты салыстыру, коллекцияның максималды және минималды элементтерін табу, сондай-ақ коллекциялардың нақты модификацияларын алу әдістері бар. белгілі түрлер (мысалы, ағынмен қауіпсіз топтаманы немесе бір элементі бар өзгермейтін топтаманы алуға болады).

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION